我在我的activty和导航抽屉中使用android.support.v4.widget.DrawerLayout占据屏幕宽度的3/4。抽屉有一个循环视图,使用一些适配器填充。现在的问题是,当我尝试滚动循环视图时,有时DrawerLayout会窃取事件并关闭抽屉而不是滚动循环视图。这使抽屉意外接近。如何防止这种情况发生。理想情况下,只要在recycleview上发生,我就不希望DrawerLayout响应触摸事件。
activity.xml -
<RelativeLayout
android:id="@+id/retail_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/contentFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/DrawerArrowStyle"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#2196F3"
android:minHeight="?attr/actionBarSize"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"></android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/chat_container"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
<ProgressBar
android:id="@+id/refreshingProgressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_marginBottom="0dp"
android:layout_marginTop="?attr/actionBarSize"
android:background="#FF000000"
android:contentDescription="Loading..."
android:indeterminateDrawable="@drawable/progress_indeterminate_horizontal"
android:indeterminateOnly="true"
android:overScrollMode="never"
android:paddingBottom="0dp"
android:visibility="gone" />
</RelativeLayout>
<android.support.design.widget.NavigationView
android:id="@+id/new_wishlist_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@android:color/white">
</android.support.design.widget.NavigationView>
今天我在努力解决这个问题,并提出了这个解决方案:
public class LockableDrawerLayout extends DrawerLayout {
private long earliestEvent = -1;
public LockableDrawerLayout(Context context) {
super(context);
}
public LockableDrawerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void lockUntil(long delay) {
this.earliestEvent = System.currentTimeMillis() + delay;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (System.currentTimeMillis() > earliestEvent) {
return super.onInterceptTouchEvent(ev);
} else {
return false;
}
}
}
从具有滚动的视图,调用lockUntil和drawerlayout将在给定的延迟时被锁定。