【问题标题】:ToggleButton onCheckChangeListener切换按钮 onCheckChangeListener
【发布时间】:2013-08-15 05:16:10
【问题描述】:

我正在制作一个具有录制按钮和切换按钮的应用程序。录制按钮开始录制声音,而切换按钮声明录制按钮是必须按住才能录制还是只按下一次。这就是我试图实现它的方式:

touchToRecord.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            saveCheckedState("touchToRecord", isChecked);

            if (isChecked)
            {
                recBtn.setOnTouchListener(new OnTouchListener(){

                    @Override
                    public boolean onTouch(View v, MotionEvent event) {

                        if (event.getAction() == MotionEvent.ACTION_DOWN)
                        {
                            recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                            chTimer.setBase(SystemClock.elapsedRealtime());
                            chTimer.setText("00:00:00");
                            chTimer.start();
                            chTimer.setTextColor(Color.GREEN);
                            startRecording();
                        }
                        else if (event.getAction() == MotionEvent.ACTION_UP)
                        {
                            recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                            chTimer.stop();
                            chTimer.setBase(SystemClock.elapsedRealtime());
                            chTimer.setText("00:00:00");
                            chTimer.setTextColor(Color.GRAY);
                            stopRecording();
                            nameAlert();
                        }
                        return true;
                    }
                });
            }
            else if (isChecked == false)
            {

            }

如您所见,如果togglebutton 为“on”或“checked”,则必须按住录制按钮才能录制,当您松开按钮时,它会停止录制。现在这可行,但它只有一个缺陷。我正在将 isChecked 状态保存到 sharedpreferences,因此如果我将切换按钮“打开”然后重新启动应用程序,切换按钮将保持“打开”状态,但我必须将其关闭并再次打开才能工作。因此,如果我重新启动应用程序,它仍会处于“开启”状态,但无法正常工作。

另外,我还没有编写代码来说明如果切换按钮为 false 会发生什么,如您所见。

我现在的代码:

if (touchToRecord.isChecked() == true)
    {
         recBtn.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                    startTimer();
                    startRecording();
                }
                else if (event.getAction() == MotionEvent.ACTION_UP)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                    stopTimer();
                    stopRecording();
                    nameAlert();
                }
            return true;
            }
        });
    }

    if (touchToRecord.isChecked() == false)
    {
        recBtn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                if (recorder == null)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn_pressed);
                    startTimer();
                    startRecording();
                }
                else if (recorder != null)
                {
                    recBtn.setImageResource(com.whizzappseasyvoicenotepad.R.drawable.record_btn);
                    stopTimer();
                    stopRecording();
                    nameAlert();
                }
            }
        });
    }

OnCheckedChangeListener:

touchToRecord.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            saveCheckedState("touchToRecord", isChecked);
        }
    });

从共享首选项中获取切换按钮状态:

touchToRecord.setChecked(getCheckedState("touchToRecord"));

【问题讨论】:

  • 为什么要在共享首选项中保存“已选中”状态?
  • @Namenlos 因为我希望应用程序记住设置,这样用户就不必在每次打开应用程序时更改它。有什么问题吗?
  • 不,没关系,我误会了;-)

标签: java android eclipse togglebutton


【解决方案1】:

这是关于你的逻辑。您有onCheckedChangeListener,这意味着当用户更改Toggle Button 时,您将检查它是On 还是Off。因此,当您杀死应用程序并重新启动时,由于Toggle Button 没有任何更改,因此它将无法正常工作。

将您的onTouchListener 放在onCheckedChangeListener 之外。在您的 onCheckedChangeListener 中设置您的状态(OnOff)并在 onTouchListener 中检查它是 On 还是 Off 并执行您的操作。

【讨论】:

  • 非常感谢!这正是我需要的那种答案,我知道我的逻辑有问题,但我无法指出它。不过还有一件事,我应该在 onCreate 中完成所有这些吗?
  • 也许你忘记喝咖啡了 :) 我也总是放在那里,所以应该没问题。不要忘记将答案标记为已接受以供将来参考
  • 还有一件事:p 我可以在 onCreate 中做一个 if 语句吗?例如:如果togglebutton被选中,则实现ontouchlistener,否则如果togglebutton未被选中,则实现onclicklistener。从现在开始,我只实现了 onclicklistener 和 ontouchlistener,然后我在其中编写了 if 语句,但它并没有像我预期的那样工作
  • 你需要onClickListener做什么?
  • 好吧,正如我在原始帖子中所说,如果选中了切换按钮,我希望记录按钮仅记录它被触摸并按住(onTouchListener 就是为此)并且如果未选中切换按钮,如果您知道我的意思,您已经按下按钮开始录制,然后再次按下停止录制(onClickListener 就是为此)
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 2017-09-26
  • 2012-04-19
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多