我在我的应用程序中使用支持库的DrawerLayout
。我注意到,当我在“抽屉” View 中单击空白区域时,基础 View (包含ListView
)会收到Touch事件并对其使用react。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
类)来防止这种行为?只要抽屉是打开的,我都不希望任何单击事件到达背景 View 。 最佳答案
在抽屉上将clickable设置为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+上可用。
关于android - Android:如何防止DrawerLayout传递触摸事件到基础 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18811973/