WindowInsetsControllerCompat设置windowLightStatusBar在API30失效怎么办
问题根因
Android 11(API 30)对状态栏样式的控制逻辑做了两处调整,是你遇到问题的核心原因:
- 仅设置
setAppearanceLightStatusBars不再自动生效,必须同时匹配状态栏背景色的属性:如果状态栏实际背景是深色,系统会直接忽略浅色状态栏(文字变深色)的配置 - 多次实例化
WindowInsetsControllerCompat会导致状态覆盖,API 30下每次新建实例都会重置部分未持久化的样式配置
解决方案
- 首先移除
updateWindowInsetsBars方法中重复的实例化代码,仅保留你原有传入的windowInsetsController逻辑,删除你额外添加的每次new新WindowInsetsControllerCompat的代码段,避免状态冲突。 - 在设置状态栏样式前先同步修改状态栏背景色,修改后的
updateWindowInsetsBars参考如下:
private void updateWindowInsetsBars(int state){ boolean isLightMode = (oldConfiguration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO; boolean isDrawerOpened = state != BottomSheetBehavior.STATE_COLLAPSED; // 先修改状态栏背景色 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (isDrawerOpened && isLightMode) { activity.getWindow().setStatusBarColor(Color.WHITE); } else { // 替换为你桌面默认的状态栏背景色 activity.getWindow().setStatusBarColor(Color.BLACK); } } // 再设置栏样式 if (isDrawerOpened && isLightMode) { windowInsetsController.setAppearanceLightNavigationBars(true); windowInsetsController.setAppearanceLightStatusBars(true); } else { windowInsetsController.setAppearanceLightNavigationBars(false); windowInsetsController.setAppearanceLightStatusBars(false); } }
- 确保Activity初始化时关闭装饰View的自适应窗口配置,在Activity的
onCreate方法中添加如下代码:
ViewCompat.setDecorFitsSystemWindows(getWindow().getDecorView(), false);
- 升级你的androidx core依赖到1.7.0及以上版本,旧版本的core库对API 30的
WindowInsetsController适配存在已知bug,会导致状态栏样式修改失效,参考依赖配置:
implementation "androidx.core:core:1.12.0"
内容的提问来源于stack exchange,提问作者SinouDev
相关产品推荐
相关产品推荐

