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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:15