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

游戏中导航栏仍显示求助:已添加隐藏代码但无效

导航栏无法隐藏的问题排查与解决

嘿,我来帮你捋捋这个问题!你写的这段代码其实在不少场景下会“失效”,我碰到过好几个开发者遇到类似情况,主要有几个常见原因和对应的解决办法:

1. 缺少沉浸式粘性标志(最常见原因)

你当前的代码只加了SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN,但默认情况下,用户只要触摸屏幕,导航栏就会重新弹出来——可能你以为没隐藏成功,其实是它弹回来了!

解决办法是加上SYSTEM_UI_FLAG_IMMERSIVE_STICKY,这个标志会让导航栏隐藏后,只有用户从边缘滑动才会临时显示,松手后又自动隐藏:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
              | View.SYSTEM_UI_FLAG_FULLSCREEN 
              | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; // 关键添加这个
decorView.setSystemUiVisibility(uiOptions);

2. Android版本适配问题

从Android 11(API 30)开始,SYSTEM_UI_FLAG_*这类旧API已经被弃用,系统可能不再优先处理这些标志。如果你的APP目标SDK版本是30及以上,建议改用新的WindowInsetsController API:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // 让布局不受系统栏约束
    getWindow().setDecorFitsSystemWindows(false);
    WindowInsetsController controller = getWindow().getInsetsController();
    if (controller != null) {
        // 隐藏导航栏和状态栏
        controller.hide(WindowInsets.Type.navigationBars() | WindowInsets.Type.statusBars());
        // 设置滑动临时显示的行为
        controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
    }
} else {
    // 旧版本兼容代码(就是上面加了IMMERSIVE_STICKY的那段)
    View decorView = getWindow().getDecorView();
    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
                  | View.SYSTEM_UI_FLAG_FULLSCREEN 
                  | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    decorView.setSystemUiVisibility(uiOptions);
}

3. 代码调用时机不对

如果只在onCreate()里调用这段代码,可能因为窗口还没完全初始化,或者后续有其他逻辑重置了UI状态。建议把隐藏代码放到onWindowFocusChanged()方法里,确保窗口获得焦点后再设置:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        // 这里放隐藏导航栏的代码
    }
}

4. 布局或主题的冲突

  • 检查你的Activity主题,有没有设置android:windowFullscreen="false"这类会覆盖全屏设置的属性;
  • 查看布局文件的根View,是否设置了fitsSystemWindows="true"——这个属性会让布局适配系统栏,可能导致导航栏无法彻底隐藏。

5. 游戏引擎的特殊情况

如果这是基于Unity、Cocos等游戏引擎开发的游戏,引擎本身可能有自己的全屏控制逻辑,会覆盖Android原生代码的设置。这种情况下,你需要去引擎的项目设置里找到“全屏”或“隐藏导航栏”的选项,或者使用引擎提供的API来实现。

先试试添加IMMERSIVE_STICKY标志,再检查调用时机,应该能解决大部分问题!

内容的提问来源于stack exchange,提问作者user3208987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:01