Jetpack Compose 如何在已部署预览中禁用/隐藏系统栏
实现方案
你当前的方法仅执行了系统栏的临时隐藏逻辑,没有配置隐藏后的交互规则、窗口状态变化的兜底逻辑,所以会在已部署预览(含最近任务预览、应用启动预览态)场景下失效,按以下方式调整即可:
- 首先补全全屏模式的核心配置,修改你现有的扩展方法,增加系统栏行为设置、布局适配规则,避免隐藏后布局错位,同时保证滑动临时唤起系统栏后会自动隐藏,不会常驻:
fun Activity.enableFullscreenMode() { val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) windowInsetsController?.apply { hide(WindowInsetsCompat.Type.systemBars()) systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } // 让应用内容铺满系统栏区域,避免切换时布局跳动 WindowCompat.setDecorFitsSystemWindows(window, false) }
- 增加窗口焦点变化的兜底逻辑:系统在窗口切换、进出预览态的时候会自动重置系统栏显示状态,需要在Activity的
onWindowFocusChanged回调里重新触发全屏设置,保证状态不丢失:
override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) enableFullscreenMode() }
- 针对系统托管预览场景做额外适配:如果需要在最近任务预览、应用快捷预览这类系统控制的预览窗口里也完全隐藏系统栏,在Activity的
onCreate生命周期中、setContentView调用之前给窗口加全屏flag即可:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) enableFullscreenMode() // 原有setContentView等业务逻辑 }
注意:如果应用targetSdk版本为34及以上,不需要再使用已废弃的
SYSTEM_UI_FLAG_IMMERSIVE_STICKY等旧版SystemUiVisibility常量,上述WindowCompat的实现已经兼容Android 5.0到14的全版本系统,不需要额外做版本分支判断。
内容的提问来源于stack exchange,提问作者Florian Reisinger
相关产品推荐
相关产品推荐

