关闭键盘后导航栏无法隐藏的技术问题求助
解决沉浸式导航栏在软键盘收起后无法隐藏的问题
嘿,我太懂你遇到的这个糟心问题了——明明一开始导航栏好好处于隐藏状态,结果填完输入框关掉键盘,它就赖着不消失了。这种情况在Android的沉浸式粘性模式下特别常见,因为软键盘弹出时系统会自动修改SystemUiVisibility的状态,而收起键盘后并不会帮我们自动恢复原来的设置。
下面给你几个靠谱的解决方案,亲测有效:
方案一:监听布局变化,手动恢复隐藏状态
我们可以通过监听根布局的全局布局变化,判断软键盘是否收起,一旦确认收起就重新应用隐藏系统UI的配置。
具体代码实现
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 初始化时先隐藏系统UI hideSystemUI(); // 获取Activity的根布局 View rootView = getWindow().getDecorView().findViewById(android.R.id.content); // 添加全局布局监听 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect visibleFrame = new Rect(); // 获取当前窗口的可视区域 rootView.getWindowVisibleDisplayFrame(visibleFrame); int screenHeight = rootView.getRootView().getHeight(); // 计算软键盘占用的高度(可视区域底部到屏幕底部的距离) int keyboardHeight = screenHeight - visibleFrame.bottom; // 当键盘高度小于设定阈值时,判断为键盘已收起(阈值可根据需求调整,比如200dp) boolean isKeyboardHidden = keyboardHeight < dpToPx(200); if (isKeyboardHidden) { // 重新恢复沉浸式隐藏状态 hideSystemUI(); } } }); } // 封装隐藏系统UI的方法 private void hideSystemUI() { Window window = getWindow(); // 隐藏状态栏 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; window.getDecorView().setSystemUiVisibility(uiOptions); } // 辅助方法:dp转px private int dpToPx(int dp) { return (int) (dp * getResources().getDisplayMetrics().density); }
方案二:适配Android 11+的新API(推荐)
如果你的应用目标版本是Android 11及以上,建议使用WindowInsetsController这个新API,旧的SystemUiVisibility已经被标记为Deprecated了,新API的行为更稳定:
private void hideSystemUI() { Window window = getWindow(); WindowInsetsController insetsController = window.getInsetsController(); if (insetsController != null) { // 同时隐藏状态栏和导航栏 insetsController.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); // 设置粘性沉浸式模式:滑动时临时显示导航栏/状态栏,松手后自动隐藏 insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); } // 兼容低版本的全屏设置 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); }
额外注意事项
- 别忘了在
onResume方法里也调用一次hideSystemUI(),因为Activity从后台回到前台时,系统UI状态可能会被重置。 - 检查你的Activity的
windowSoftInputMode属性,避免使用adjustResize或adjustPan这类可能干扰沉浸式模式的配置,如果必须用,要确保监听逻辑能正确触发。
内容的提问来源于stack exchange,提问作者Swiffer
相关产品推荐
相关产品推荐

