解决DrawerLayout与ViewPager滑动冲突:如何彻底禁用DrawerLayout的打开及关闭滑动手势?
刚好之前我也遇到过一模一样的问题!你说的没错,LOCK_MODE_LOCKED_CLOSED确实只能阻止从关闭状态滑开抽屉,但抽屉打开后还是能通过滑动关闭。要彻底禁用所有滑动手势,只保留按钮控制,有两种靠谱的方案:
方案1:动态切换Drawer锁模式
利用DrawerLayout自带的锁模式常量,在抽屉状态变化时动态切换锁的类型,彻底锁住所有滑动操作:
// 初始化时先锁住关闭状态,禁止滑动打开抽屉 mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); // 设置抽屉状态监听器,在抽屉打开/关闭时更新锁模式 mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); // 抽屉打开后,锁住打开状态,禁止滑动关闭 mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); // 抽屉关闭后,恢复锁住关闭状态,禁止滑动打开 mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } });
之后你只需要在汉堡按钮和菜单内的X按钮点击事件里,通过代码控制抽屉的开闭:
// 汉堡按钮打开抽屉 hamburgerBtn.setOnClickListener(v -> { mDrawerLayout.openDrawer(GravityCompat.START); }); // 菜单内X按钮关闭抽屉 closeMenuBtn.setOnClickListener(v -> { mDrawerLayout.closeDrawer(GravityCompat.START); });
方案2:自定义DrawerLayout彻底拦截滑动事件
如果觉得动态切换锁模式不够彻底,可以直接自定义DrawerLayout,重写触摸事件方法,完全屏蔽掉所有滑动触发的抽屉操作:
public class NoSwipeDrawerLayout extends DrawerLayout { public NoSwipeDrawerLayout(Context context) { super(context); } public NoSwipeDrawerLayout(Context context, AttributeSet attrs) { super(context, attrs); } public NoSwipeDrawerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // 不拦截任何触摸事件,让子View(比如ViewPager)完全处理滑动 return false; } @Override public boolean onTouchEvent(MotionEvent ev) { // 不处理任何触摸事件,彻底屏蔽抽屉的滑动触发逻辑 return false; } }
然后在布局文件里用这个自定义的NoSwipeDrawerLayout替换原生的DrawerLayout,之后同样通过按钮点击调用openDrawer()和closeDrawer()来控制抽屉即可。
这样设置后,不管抽屉是打开还是关闭状态,滑动操作都会完全交给ViewPager处理,不会再和DrawerLayout产生冲突!
内容的提问来源于stack exchange,提问作者sortinousn
相关产品推荐
相关产品推荐

