2013-09-15 1 views
44

Я использую DrawerLayout библиотеки поддержки в своем приложении. Я заметил, что, когда я нажимаю на пустую область в представлении «Ящик», базовый вид (содержащий ListView) получает событие Touch и реагирует на него.Android: Как мне сохранить DrawerLayout от прохождения событий касания к базовому виду

Способ по DrawerLayoutonInterceptTouchEvent выглядит следующим образом:

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

+0

Когда ящик откроется, добавьте простой 'View' поверх текущего содержимого вашего приложения, в котором на нем установлен' OnTouchListener', чтобы вернуть 'true' (что означает, что он будет есть все события касания). – Luksprog

+1

Это кажется довольно взломанным, но является простым решением. Я надеялся на метод API, хотя ... – janoliver

+0

@janoliver вы придумали более элегантное решение? – ataulm

ответ

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> 

Я добавил android:importantForAccessibility="no", потому что маркировка ящик как интерактивный (кликабельны или фокусируемый) сделает весь ящик видимым для услуг, таких как TalkBack.

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

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

+1

Звучит разумно. Я попробую это позже, спасибо за ответ! И ответить на ваш вопрос-комментарий: я пока не нашел элегантного решения. Ваш будет первым. :) – janoliver

+0

@janoliver Это сработало? – ataulm

+0

Yup, работает. Еще раз спасибо. – janoliver

Смежные вопросы