【问题标题】:In android, onlongclick is not calling after ontouchevent在android中,onlongclick在ontouchevent之后没有调用
【发布时间】:2014-07-18 10:09:59
【问题描述】:

我创建了一个名为 RecorderView 的新 view,在这个类中有一个 onTouchEvent(),如下所示,

@Override
    public boolean onTouchEvent(MotionEvent event) {

        if (isRecording) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Log.d("JM", "ACTION_DOWN");
                return false;
            }

            if (event.getAction() == MotionEvent.ACTION_UP) {
                Log.d("JM", "ACTION_UP");
                handler.removeCallbacks(runnable);
                stopRecord();
            }
            return true;
        }
        return false;

    }

然后这个视图通过扩展 BaseAdapter 在列表视图中膨胀,并且它在 getView() 内部有一个 setOnLongClickListener(),如下所示

holder.recordView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Log.d("JM", "On list item clicked");
                holder.recordView.startRecord();
                return false;
            }
        });

现在问题是 setOnLongClickListener() 没有执行。

我正在努力解决过去 2 天的问题。但仍然没有解决。

【问题讨论】:

    标签: android android-view


    【解决方案1】:

    您是否尝试过使用OnItemLongClick 来实现您想要的?我相信您希望 ListView 的每一项都响应OnLongClick,对吧?

    【讨论】:

    • OnItemLongClick 正在调用,但现在 MotionEvent.ACTION_UP 没有得到
    • @JMIndia 您必须在您的MotionEvent.ACTION_DOWN 中返回true,以便处理MOTIONEVENT.ACTION_UP,否则不会将控制权返回给应用程序并在MotionEvent.ACTION_DOWN 事件处结束执行。您可以通过在控制台中为MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP 写出一些字符串来测试这一点
    • 嗨,我也试过了。但当时 OnItemLongClick 没有调用:(
    【解决方案2】:

    当您为任何视图覆盖 onTouchEvent 时,longpressed 仅由 onTouchEvent 使用。 Here 是一篇有用的帖子,使用提到的解决方案,您可以使用 onTouchEvent 实现长按。

    textView.setOnTouchListener(new View.OnTouchListener() {
    
        private static final int MIN_CLICK_DURATION = 1000;
        private long startClickTime;
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                longClickActive = false;
                break;
            case MotionEvent.ACTION_DOWN:
                if (longClickActive == false) {
                    longClickActive = true;
                    startClickTime = Calendar.getInstance().getTimeInMillis();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (longClickActive == true) {
                    long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                    if (clickDuration >= MIN_CLICK_DURATION) {
                        Toast.makeText(MainActivity.this, "LONG PRESSED!",Toast.LENGTH_SHORT).show();
                        longClickActive = false;
                    }
                }
                break;
            }
            return true;
        }
    });
    

    其中私有布尔longClickActive = false;是一个类变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 2016-08-18
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多