decorView.systemUiVisibility已废弃 如何正确替换该API
旧代码逻辑解析
你贴的两段旧代码是Android旧版本实现沉浸式布局的典型写法,各flag作用如下:
- 第一段配置是沉浸式布局的基础:
View.SYSTEM_UI_FLAG_LAYOUT_STABLE:固定系统栏(状态栏、导航栏)的布局占位边界,避免系统栏显隐时触发应用内容的布局跳动View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:允许应用内容区域延伸绘制到状态栏下方,让状态栏悬浮在应用内容上层,实现沉浸式视觉效果
- 第二段配置是追加浅色状态栏模式:在原有UI配置基础上,将状态栏的文字、图标切换为深色,适配浅色的状态栏/页面顶部背景,避免浅色背景下白色状态栏元素看不清的问题。
废弃API的适配写法
View.systemUiVisibility 相关控制位从Android 11(API 30)开始被官方标记为废弃,新的系统UI控制统一通过WindowInsetsController体系实现,推荐使用AndroidX提供的兼容类WindowInsetsControllerCompat实现全版本适配,不需要手动判断SDK版本。
第一步:替换沉浸式基础配置
删除原来给systemUiVisibility赋值SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN的代码,在Activity的onCreate方法中添加如下配置:
// 等价于旧版两个LAYOUT flag的组合效果:让内容延伸到系统栏下方 window.setDecorFitsSystemWindows(false) // 如果需要透明状态栏,追加这行即可 window.statusBarColor = android.graphics.Color.TRANSPARENT
该配置在AppCompatActivity下有完整的低版本兼容实现,
WindowInsetsControllerCompat会自动处理不同系统版本的逻辑差异。
第二步:替换浅色状态栏配置
删除原来追加SYSTEM_UI_FLAG_LIGHT_STATUS_BAR的代码,通过WindowInsetsControllerCompat设置浅色状态栏状态:
val insetsController = WindowInsetsControllerCompat(window, window.decorView) // 开启浅色状态栏:状态栏文字、图标变为深色 insetsController.isAppearanceLightStatusBars = true // 如果需要同时适配浅色导航栏(导航栏图标变深色),追加对应配置即可 // insetsController.isAppearanceLightNavigationBars = true
如果后续需要关闭浅色状态栏,把isAppearanceLightStatusBars设为false即可,兼容类会自动在低版本系统上回退到旧的systemUiVisibility位操作逻辑,行为和旧代码完全一致。
内容的提问来源于stack exchange,提问作者Vladimir Fisher
相关产品推荐
相关产品推荐

