support studio android android-support-library drawerlayout

studio - Android: ¿Cómo evito que DrawerLayout pase los eventos táctiles a la vista subyacente?



navigation drawer android studio (1)

Establezca la posibilidad de hacer clic en true en el cajón: consumirá el toque.

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

Agregué android:importantForAccessibility="no" porque marcar el cajón como interactivo (se puede hacer clic o enfocar) hará que todo el cajón sea visible para los servicios de accesibilidad como TalkBack.

Esto no es lo que usted quiere (generalmente); más a menudo, los elementos dentro del cajón deben ser accesibles a los servicios.

Este atributo solo está disponible en API 16+.

Estoy utilizando DrawerLayout la biblioteca de DrawerLayout en mi aplicación. Noté que, cuando hago clic en un área vacía en mi vista del Cajón, la Vista subyacente (que contiene un ListView ) recibe el evento táctil y reacciona a él.

El método onInterceptTouchEvent de DrawerLayout ve así:

@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; }

Mi vista con el 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>

¿Qué puedo hacer (si es posible sin extender la clase DrawerLayout ) para evitar este comportamiento? Mientras el cajón esté abierto, no quiero que los eventos de clic alcancen la vista de fondo.