Android导航抽屉在Fragment中锁定滑动失效问题求助
解决Fragment中DrawerLayout锁定模式因键盘开闭失效的问题
这种情况我之前也碰到过,核心问题在于软键盘的显示/隐藏会触发Activity的配置变更或者视图状态重置,导致你在onResume中设置的DrawerLayout锁定模式被系统默认行为覆盖了。只在onResume里设置一次锁定,没办法应对键盘关闭后触发的状态重置操作。
给你几个可行的解决方案:
方案1:在onConfigurationChanged中重新锁定
软键盘弹出时,系统会触发onConfigurationChanged回调(前提是你在Manifest中给Activity配置了对应参数),我们可以在这里再次设置锁定模式,覆盖系统的重置行为:
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 重新锁定抽屉为关闭状态 MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); }
别忘了在AndroidManifest.xml中给对应的Activity添加配置,避免系统重建Activity:
<activity android:name=".MainActivity" android:configChanges="keyboardHidden|screenSize|orientation"> </activity>
方案2:在onViewStateRestored中补充设置
Fragment的视图状态恢复时,可能会重置部分UI状态,我们可以在这个回调里再补一次锁定操作:
@Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); }
方案3:监听键盘显示/隐藏事件(更精准)
如果上面的方案效果不理想,可以直接监听键盘的状态变化,在键盘关闭后立即重新锁定抽屉:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect visibleFrame = new Rect(); view.getWindowVisibleDisplayFrame(visibleFrame); int screenHeight = view.getRootView().getHeight(); int keyboardHeight = screenHeight - visibleFrame.bottom; // 当键盘高度占比小于15%时,判定为键盘关闭 if (keyboardHeight <= screenHeight * 0.15) { MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } } }); }
另外提个小建议:尽量不要用MainActivity.mDrawerLayout这种静态变量直接访问,最好通过接口回调或者requireActivity()的方式获取DrawerLayout,比如:
DrawerLayout drawerLayout = ((MainActivity) requireActivity()).getDrawerLayout(); if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); }
这样能避免潜在的内存泄漏风险,代码也更健壮。
内容的提问来源于stack exchange,提问作者hari86
相关产品推荐
相关产品推荐

