【问题标题】:android - MotionEvent.ACTION_UP is never calledandroid - MotionEvent.ACTION_UP 永远不会被调用
【发布时间】:2019-02-21 07:30:29
【问题描述】:

我想在用户将手放在视图上时做一些工作,并在他释放它时停止它。我的代码如下:

viewHolder.plus.setOnTouchListener(new View.OnTouchListener() {
        private Handler mHandler;
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    if(mHandler==null)
                        mHandler = new Handler();
                    mHandler.postDelayed(mAction, 500);
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.v("this","cancel");
                    if (mHandler != null) {
                        mHandler.removeCallbacks(mAction);
                        mHandler = null;
                        Log.v("this", "c cancel");
                    }
                    break;
            }
            return false;
        }

        Runnable mAction = new Runnable() {
            @Override public void run() {
                ChangeTedad(item.getid(), "plus");
                Log.v("this","Cc");
                mHandler.postDelayed(this, 500);
            }
        };

    });

问题是,ACTION_UP 永远不会被调用,并且 runnable 会永远运行。

当用户取消触摸它时如何停止运行?

【问题讨论】:

  • 你确定吗?我用一个新创建的项目的简单的 hello world 文本视图尝试了你的代码,它工作正常。也许你应该添加视图?
  • @Community 感谢您的帮助,我应该在哪里添加视图?代码在适配器里面,会不会出问题?
  • 我认为,只需将查看器的简单布局添加到问题中即可。既然您提到它,适配器也可能导致此问题。你在使用recyclerview吗?还有什么时候添加触摸监听器?

标签: android android-view android-touch-event


【解决方案1】:

您没有在触摸事件中正确设置中断和返回标志。

请将您的代码替换为,

viewHolder.plus.setOnTouchListener(new View.OnTouchListener() {
        private Handler mHandler;
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    if(mHandler==null)
                        mHandler = new Handler();
                    mHandler.postDelayed(mAction, 500);
                    break;
                case MotionEvent.ACTION_UP:
                    Log.v("this","cancel");
                    if (mHandler != null) {
                        mHandler.removeCallbacks(mAction);
                        mHandler = null;
                        Log.v("this", "c cancel");
                    }
                    break;
            }
            return true;
        }

        Runnable mAction = new Runnable() {
            @Override public void run() {
                ChangeTedad(item.getid(), "plus");
                Log.v("this","Cc");
                mHandler.postDelayed(this, 500);
            }
        };
    });

希望对你有帮助

【讨论】:

  • 感谢您的回复,我做了更改,同样的事情发生了,它运行并且永不停止
【解决方案2】:

您也可以将ACTION_UP逻辑代码添加到ACTION_CANCEL中,因为如果您触摸并释放视图,它将调用ACTION_UP,但如果您处于视图按下状态并且您移动了 1 个像素,它会调用 ACTION_UP,并且只调用 ACTION_CANCEL。希望这对您有所帮助。

viewHolder.plus.setOnTouchListener(new View.OnTouchListener() {
        private Handler mHandler;
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    if(mHandler==null)
                        mHandler = new Handler();
                    mHandler.postDelayed(mAction, 500);
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.v("this","cancel");
                    if (mHandler != null) {
                        mHandler.removeCallbacks(mAction);
                        mHandler = null;
                        Log.v("this", "c cancel");
                    }
                    break;
                case MotionEvent.ACTION_CANCEL:
                    Log.v("this","cancel");
                    if (mHandler != null) {
                        mHandler.removeCallbacks(mAction);
                        mHandler = null;
                        Log.v("this", "c cancel");
                    }
                    break;
            }
            return false;
        }

        Runnable mAction = new Runnable() {
            @Override public void run() {
                ChangeTedad(item.getid(), "plus");
                Log.v("this","Cc");
                mHandler.postDelayed(this, 500);
            }
        };

    });

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2017-01-20
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多