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

如何通过编程方式禁用Android沉浸式模式?

解决Android应用系统更新后自动进入沉浸式模式的问题

是不是系统新默认行为?

不是全局默认行为。这种情况大概率是系统更新后,你的应用因targetSdkVersion适配逻辑变化、主题配置隐性触发,或是依赖库/第三方SDK偷偷修改了系统UI设置导致的,其他应用正常也印证了这是应用自身的问题。

关闭沉浸式模式的可行方法

1. 主题配置修改(推荐,无需编写代码)

打开AndroidManifest.xml,找到出现问题的Activity对应的theme属性,确保主题满足以下设置:

  • 移除android:windowTranslucentStatus、android:windowTranslucentNavigation这两个属性(如果设置为true会导致系统栏透明重叠)
  • 添加强制显示系统栏并设置背景的属性:
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/your_status_bar_color</item>
<item name="android:navigationBarColor">@color/your_navigation_bar_color</item>

如果使用AppCompat主题,将属性前缀替换为app:,比如app:statusBarColor

2. 代码强制重置系统UI可见性

仅调用setSystemUiVisibility(0)无法覆盖所有可能的沉浸式标志位,需要明确设置系统栏可见的标志。在Activity的onCreate或onResume方法中添加以下代码:

Java版本

import android.view.View;
import androidx.core.content.ContextCompat;

// ...

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_VISIBLE
    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
);
// 设置系统栏背景色,避免界面穿透
getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.your_status_bar_color));
getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.your_navigation_bar_color));

Kotlin版本

import android.view.View
import androidx.core.content.ContextCompat

// ...

window.decorView.systemUiVisibility = (
    View.SYSTEM_UI_FLAG_VISIBLE
    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
)
window.statusBarColor = ContextCompat.getColor(this, R.color.your_status_bar_color)
window.navigationBarColor = ContextCompat.getColor(this, R.color.your_navigation_bar_color)

3. 排查第三方依赖

某些第三方UI库、广告SDK或埋点工具可能会在后台修改系统UI设置。尝试暂时移除近期更新的依赖,测试问题是否消失,定位到可疑库后查看其文档或修改配置。

Android 11+ 额外处理

如果你的应用适配了Android 11及以上版本,使用WindowInsetsController API时,确保调用show()方法而非hide():

import android.view.WindowInsets;
import android.view.WindowInsetsController;

// ...

WindowInsetsController insetsController = getWindow().getInsetsController();
if (insetsController != null) {
    insetsController.show(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
    // 设置触摸显示系统栏的行为,避免再次进入沉浸式
    insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:52:19