Android 13中设置状态栏与导航栏样式时状态栏文字颜色异常问题
解决Android 13中状态栏/导航栏白背景黑文字的配置冲突问题
问题根源
Android 13(API 33)开始,setSystemUiVisibility方法已被废弃,使用旧API设置SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR时,会覆盖XML中配置的windowLightStatusBar属性,导致状态栏文字变回白色。
方案1:使用WindowInsetsController API(推荐)
这是Android 11+官方推荐的新方式,能独立控制状态栏和导航栏的文字/图标颜色,避免配置冲突:
1. 调整XML配置
确保状态栏和导航栏背景为白色:
<item name="android:navigationBarColor">@color/white</item> <item name="android:statusBarColor">@color/white</item> <!-- 可选:保留此配置,代码会覆盖,也可直接移除 --> <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
2. 替换Java代码
在Activity的onCreate方法中替换原有代码:
WindowInsetsController insetsController = getWindow().getDecorView().getWindowInsetsController(); if (insetsController != null) { // 设置状态栏文字/图标为深色 insetsController.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ); // 设置导航栏图标为深色(Android O及以上版本支持) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { insetsController.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS ); } }
方案2:修复旧API的使用逻辑
若需兼容低版本,需同时设置状态栏和导航栏的浅色标志,防止配置被覆盖:
int uiFlags = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { uiFlags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { uiFlags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } getWindow().getDecorView().setSystemUiVisibility(uiFlags);
注意事项
- 确认
@color/white为纯白色,保证文字与背景的对比度符合系统规范。 - Android 13及以上版本优先使用
WindowInsetsController,旧API后续版本可能会被彻底移除。
内容的提问来源于stack exchange,提问作者rahim
相关产品推荐
相关产品推荐

