将触摸事件传递给Android中的Parent View的onTouchListener

时间:2014-08-24 19:52:50

标签: android

我有一个列表视图,其项目是一个linearlayout,它有一个按钮作为子视图。我希望linearlayout的ontouchLIstener能够正常工作。我不想使用onInterceptTouchEvent。有没有办法可以通过触摸将该按钮传递给父列表视图。我试过这个 - 从按钮的onTouchListener

返回true
private View.OnTouchListener buttonListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            Log.i(TAG, "Button On Touch");
            return true;
        }
};

但这不起作用。它不会将触摸事件传递给linearlayout的onTouchListener

一定有它应该有用。

2 个答案:

答案 0 :(得分:9)

View组的事件链如下所示 - 调用dispatchEvent。然后dispatchEvent调用onInterceptTouchEvent。如果它返回 false ,则触摸事件将传递给ViewGroup的子项。如果任何一个孩子消耗该事件(在这种情况下按钮消耗该事件),即如果他们返回 true 那么动作事件不会传递给其他方法。由于按钮是可点击的,因此在这种情况下返回true。

如果onInterceptTouchEvent方法返回true,则子视图不会被赋予运动事件,而是ViewGroup的onTouchListener或者调用onTouch方法。
因此,要将触摸事件传递给父级(查看组)onTouchListener,请确保在父级(ViewGroup)的onInterceptTouchEvent方法中返回 true 。您必须覆盖onDispatchTouchEvent()

@Override
    public boolean onInterceptTouchEvent(MotionEvent motionEvent) {

        Log.i(TAG,"PARENT.onInterceptTouchEvent");

        return true;
}

有关如何完成触摸式导航的详细信息,请参阅this stack post

答案 1 :(得分:1)

使用以下方法将按钮可点击属性设置为false

button.setClickable(false);

然后在按钮的onTouch中:

return false;

注意:此行为特定于按钮(以及clickable属性设置为true的任何其他视图),即使您从{{1}返回false它不会将事件传播到父级,并且无论如何都会调用该按钮的onTouch方法。


编辑:另一种方法是扩展onClick课程并覆盖ListView

onInterceptTouch