如何在横竖屏切换时保持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,直接处理配置变化。
步骤:
- 在
AndroidManifest.xml的目标Activity标签中添加configChanges属性:
<activity android:name=".YourActivity" android:configChanges="orientation|screenSize|smallestScreenSize" ...> </activity>
- 在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
相关产品推荐
相关产品推荐

