Я использую DrawerLayout
библиотеки поддержки в своем приложении. Я заметил, что, когда я нажимаю на пустую область в представлении «Ящик», базовый вид (содержащий ListView
) получает событие Touch и реагирует на него.Android: Как мне сохранить DrawerLayout от прохождения событий касания к базовому виду
Способ по DrawerLayout
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
класса), чтобы предотвратить это поведение? Пока ящик открыт, я не хочу, чтобы события щелчка отображались в фоновом режиме.
Когда ящик откроется, добавьте простой 'View' поверх текущего содержимого вашего приложения, в котором на нем установлен' OnTouchListener', чтобы вернуть 'true' (что означает, что он будет есть все события касания). – Luksprog
Это кажется довольно взломанным, но является простым решением. Я надеялся на метод API, хотя ... – janoliver
@janoliver вы придумали более элегантное решение? – ataulm