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+。