You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭键盘后导航栏无法隐藏的技术问题求助

解决沉浸式导航栏在软键盘收起后无法隐藏的问题

嘿,我太懂你遇到的这个糟心问题了——明明一开始导航栏好好处于隐藏状态,结果填完输入框关掉键盘,它就赖着不消失了。这种情况在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:08:07