android - 在 Android 中的监听器之间切换

标签 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() 监听器。

谢谢大家

最佳答案

您的 OnClickListenerACTION_UP 上触发,因为您从 onTouch() 无条件返回 false。在那里返回 false 告诉 View 您还没有使用该事件,它也应该处理它。在这种情况下,这意味着 View 将执行它的点击处理,现在它有一个 OnClickListener 集,它被调用。 (事实上​​,您可以从一开始就设置 OnClickListener,并且会实现相同的行为。)

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

与其处理监听器并尝试决定要使用哪些事件以及传递哪些事件,不如处理 OnTouchListener 中的所有内容,在某种标志中跟踪当前状态变量,并再次在 onTouch() 中无条件返回 false。通过这种方式,我们只是简单地“插入”了所需的行为,并允许 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;
    }
};

关于android - 在 Android 中的监听器之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42932838/

相关文章:

java - 哪个快 : store 10^5 size array in android app and search in it or fire queries of search and get data from database

C#如何将不同按钮的按钮文本设置到同一个文本框

JavaFX:带有关闭按钮的 HBox

Java 数据库应用程序加载大量记录时卡住

mysql - R Shiny 中的selectInput

ruby - 对数字密码进行排名的算法?

Android — 像 Google Chrome 新按钮一样单击按钮时添加新标签?

java - 检查下载是否有效

android - Android 浏览器是否支持 SPDY 协议(protocol)?

Android Video View 在某些设备上无法播放 MP4 文件