Intereting Posts

Android: как я могу заставить DrawerLayout передавать события касания к основному виду

Я использую DrawerLayout библиотеки DrawerLayout в своем приложении. Я заметил, что, когда я нажимаю на пустую область в представлении «Ящик», базовый вид (содержащий 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; } 

Мой взгляд с 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 ), чтобы предотвратить это поведение? Пока ящик открыт, я не хочу, чтобы события щелчка отображались в фоновом режиме.

Solutions Collecting From Web of "Android: как я могу заставить DrawerLayout передавать события касания к основному виду"

Установите курсор на true в ящике – он будет потреблять прикосновение.

 <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" поскольку маркировка ящика как интерактивного (с возможностью клика или фокусировки) сделает весь ящик видимым для служб доступности, таких как TalkBack.

Это не то, что вы хотите (обычно) – чаще, предметы внутри ящика должны быть доступны для служб.

Этот атрибут доступен только для API 16+.