Android:我如何让DrawerLayout将触摸事件传递给底层视图

我在我的应用程序中使用支持库的DrawerLayout 。 我注意到,当我点击我的Drawer视图中的一个空白区域时,底层的View(包含一个ListView )接收到Touch事件并对它做出反应。

onInterceptTouchEvent方法如下所示:

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); // "|" used deliberately here; both methods should be invoked. final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) | mRightDragger.shouldInterceptTouchEvent(ev); boolean interceptForTap = false; switch (action) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); final float y = ev.getY(); mInitialMotionX = x; mInitialMotionY = y; if (mScrimOpacity > 0 && isContentView(mLeftDragger.findTopChildUnder((int) x, (int) y))) { interceptForTap = true; } mDisallowInterceptRequested = false; mChildrenCanceledTouch = false; break; } case MotionEvent.ACTION_MOVE: { // If we cross the touch slop, don't perform the delayed peek for an edge touch. if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { mLeftCallback.removeCallbacks(); mRightCallback.removeCallbacks(); } break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: { closeDrawers(true); mDisallowInterceptRequested = false; mChildrenCanceledTouch = false; } } return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch; } 

我的看法与DrawerLayout

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/sidebar_container" android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="left"/> </android.support.v4.widget.DrawerLayout> 

我能做什么,(如果可能的话,不扩展DrawerLayout类)来防止这种行为? 只要抽屉打开,我不想要点击事件到达背景视图。

在抽屉上设置可点击为真 – 它会消耗触摸。

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_view" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/drawer_view" android:layout_width="300dp" android:clickable="true" android:importantForAccessibility="no" android:layout_height="match_parent" android:layout_gravity="left"/> </android.support.v4.widget.DrawerLayout> 

我添加了android:importantForAccessibility="no"因为将抽屉标记为交互式(可点击或可聚焦)会使整个抽屉对“话语提示”等无障碍服务可见。

这不是你想要的(通常) – 更经常地,抽屉里面的物品应该可以被服务使用。

此属性仅适用于API 16+。