安卓父View LongClick和子View Click 冲突

需求

在列表中,列表item需要LongClick事件,列表中的子View需要处理Click事件。

解决

  1. 给子View也添加LongClick事件,调用父View的LongClick逻辑。
  2. 父View拦截LongClick事件。
 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int mask = ev.getActionMasked();
        if (mask == MotionEvent.ACTION_DOWN) {
            mLongPressTriggered = false;
        }
        boolean handle = super.dispatchTouchEvent(ev);
        if (mask == MotionEvent.ACTION_DOWN && isLongClickable()) {
            scheduleLongPress();
        }
        if (ev.getActionMasked() == MotionEvent.ACTION_UP
                || ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
            removeLongPress();
        }
        return handle;
    }

    private void scheduleLongPress() {
        postDelayed(longClickRunnable, ViewConfiguration.getLongPressTimeout());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mLongPressTriggered && event.getActionMasked() == MotionEvent.ACTION_UP) {
            return true;
        }
        return super.onTouchEvent(event);
    }

    private final Runnable longClickRunnable = new Runnable() {
        @Override
        public void run() {
            mLongPressTriggered = performLongClick();
            Log.d(TAG, "run() called" + mLongPressTriggered);
        }
    };

    private void removeLongPress() {
        removeCallbacks(longClickRunnable);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (mLongPressTriggered && ev.getActionMasked() == MotionEvent.ACTION_UP) {
            return true;
        }
        return super.onInterceptTouchEvent(ev);
    }
复制代码

代码

Demo

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享