Android中的监听器之间的交换

时间:2017-03-21 16:23:39

标签: android user-interface button listeners

我在处理按钮及其两个听众时遇到问题。 我的目标是使用它交换两个按钮的监听器。 这不是我需要的行为。我需要释放按钮,然后以不同的方式再次单击它(使用不同的监听器)。 那么..我" onTouch"这个按钮,当我松开手指时,我需要更换它的" onTouch"监听" onClick()"之一。

现在,我尝试完成以下目标:

 final View.OnClickListener play_listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) { Utility.playRecording(mediaPlayer); } };

 final View.OnTouchListener rec_listener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            if (Utility.checkPermission(view.getContext())) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer);
                        break;

                    case MotionEvent.ACTION_UP:
                        Utility.stopRecording(recorder, timer);
                    //disabling my onTouch Listener
                        recplay_button.setOnTouchListener(null);
                    //Setting a new listener for the same button
                        recplay_button.setOnClickListener(play_listener);
                    //Changing its color.
                        recplay_button.setBackground(getDrawable(R.drawable.coloranimreverse));
                        break;
                }
            } else {
                Utility.requestPermission(view.getContext());
            } return false; }};

所以,交换工作但我无法理解为什么在设置onClickListener之后它也执行它,播放我在另一个监听器中设置的声音。 MotionEvent.ACTION_UP是否算作点击?

你知道我怎么能通过这个?我需要的是在我在OnTouch()监听器中设置它的同一时刻不执行onClick()监听器。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

OnClickListener ACTION_UP正在点击false,因为您无条件地从onTouch()返回false。返回View会告诉View您没有消费该事件,并且它应该处理它。在这种情况下,这意味着OnClickListener将执行其点击处理,现在它已经设置了OnClickListener,这将被调用。 (事实上​​,您可以从一开始就设置true,并且会实现相同的行为。)

ACTION_UP case中返回View会表示您在那里消费了该事件,因此OnClickListener不会最终调用它View。这可能足以满足您的使用情况,但是,这也意味着ACTION_UP不会执行通常对Drawable执行的任何其他状态更改;例如,将其OnTouchListener更改为未按下状态。

不是在处理侦听器,并试图决定要使用哪些事件以及传递哪些事件,而是最好处理false中的所有事件,在某种标志变量中跟踪当前状态,以及再次onTouch()无条件地返回View。通过这种方式,我们只需简单地插入"期望的行为,并允许private boolean recordState = true; final View.OnTouchListener rec_listener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if (Utility.checkPermission(view.getContext())) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (recordState) { Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer); } break; case MotionEvent.ACTION_UP: if (recordState) { recordState = false; Utility.stopRecording(recorder, timer); recplay_button.setImageDrawable(getResources().getDrawable(R.drawable.coloranimreverse)); } else { Utility.playRecording(mediaPlayer); } } } else { Utility.requestPermission(view.getContext()); } return false; } }; 继续像往常一样处理事件和状态。

例如:

{{1}}