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

如何在横竖屏切换时保持Sticky Immersive Mode状态?

修复Sticky Immersive Mode横竖屏切换后状态栏重新显示的问题

我之前也踩过这个坑!横竖屏切换时,Android系统会默认销毁并重建你的Activity,原来设置的沉浸式UI Flags会被系统重置,这就是状态栏突然冒出来甚至变成非半透明状态的原因。下面给你几个实用的修复方案:

方案1:在关键生命周期中重新应用沉浸式Flags(最通用)

把沉浸式设置封装成一个独立方法,然后在Activity恢复可见、获得窗口焦点的生命周期方法里调用,确保每次界面状态变化后都能重新生效。

步骤:

  • 先封装设置方法:
private void setupStickyImmersiveMode() {
    View decorView = getWindow().getDecorView();
    // 先清除所有可能冲突的UI Flags
    decorView.setSystemUiVisibility(0);
    // 设置Sticky Immersive模式所需的Flags
    int uiFlags = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    decorView.setSystemUiVisibility(uiFlags);
}
  • 在onResume和onWindowFocusChanged中调用这个方法:
@Override
protected void onResume() {
    super.onResume();
    setupStickyImmersiveMode();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // 只有当窗口获得焦点时才重新设置,避免不必要的调用
    if (hasFocus) {
        setupStickyImmersiveMode();
    }
}

为什么选这两个方法?

  • onResume:Activity从后台回到前台、横竖屏重建完成后都会触发,能确保界面可见时沉浸式生效;
  • onWindowFocusChanged:当窗口重新获得焦点(比如横竖屏切换完成后),这个方法会被调用,补充覆盖一些onResume没覆盖到的场景。

方案2:禁止Activity在横竖屏时重建(可选)

如果你的界面不需要在横竖屏时做特殊布局适配,可以让系统不销毁重建Activity,直接处理配置变化。

步骤:

  1. 在AndroidManifest.xml的目标Activity标签中添加configChanges属性:
<activity
    android:name=".YourActivity"
    android:configChanges="orientation|screenSize|smallestScreenSize"
    ...>
</activity>
  1. 在Activity中重写onConfigurationChanged方法,重新设置沉浸式Flags:
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setupStickyImmersiveMode(); // 调用之前封装的方法
}

注意:这个方案适合不需要横竖屏布局切换的场景,如果你的App需要不同的横竖屏布局,不建议用这个方法,会导致布局适配出问题。

额外注意事项

  • 如果你用的是AppCompatActivity,确保调用getWindow().getDecorView()来设置Flags,不要用其他View;
  • 不要只在onCreate中设置沉浸式Flags,因为横竖屏重建后onCreate会调用,但有些场景(比如从其他App切回来)不会走onCreate,所以多在几个生命周期点设置更稳妥;
  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY的特性是:拖动状态栏/导航栏后,它们会自动隐藏,但前提是Flags没有被系统重置——所以我们要做的就是在重置后重新设置这些Flags。

试试这些方案,应该能解决你遇到的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:57:34