Android:如何使DrawerLayout不会将触摸事件传递给基础视图

jan*_*ver 45 android android-support-library drawerlayout

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

看起来像这样的onInterceptTouchEvent方法DrawerLayout:

@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;
}
Run Code Online (Sandbox Code Playgroud)

我的看法是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>
Run Code Online (Sandbox Code Playgroud)

我该怎么办(如果可能的话,不延长DrawerLayout课程)来防止这种行为?只要抽屉打开,我就不希望任何点击事件到达背景视图.

ata*_*ulm 80

在抽屉上设置可点击为真 - 它将消耗触摸.

<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>
Run Code Online (Sandbox Code Playgroud)

我添加了android:importantForAccessibility="no"因为将抽屉标记为交互式(可点击或可聚焦)将使整个抽屉对TalkBack等可访问性服务可见.

这不是您想要的(通常) - 更常见的是,抽屉的物品应该可供服务使用.

此属性仅适用于API 16+.

  • 我只是想为任何可能觉得有用的人添加一个注释.我的'DrawerLayout`包含一个`fragment`而不是`FrameLayout`用于`@ + id/sidebar_container`(或者在我的情况下是`@ + id/navigation_drawer`).您可以简单地将`android:clickable ="true"`添加到该片段的xml文件的基本布局中,因为`fragment`将无法识别`clickable`属性. (7认同)