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