Android应用:切换状态栏图标颜色时如何控制导航栏图标颜色?
解决方案
问题原因
你调用getWindow().getDecorView().setSystemUiVisibility(0)时,会清除所有已设置的系统UI标志,包括导航栏的相关配置,所以导航栏图标颜色会跟着变化,而非仅修改状态栏。
正确处理方式
方式1:保留导航栏配置,仅修改状态栏(兼容API 23+)
获取当前已设置的系统UI标志,仅移除状态栏的浅色图标标志,保留导航栏原有配置:
// 切换状态栏图标为白色时,不要直接设为0 int currentFlags = getWindow().getDecorView().getSystemUiVisibility(); // 移除状态栏浅色图标标志 currentFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // 重新设置标志,导航栏配置不受影响 getWindow().getDecorView().setSystemUiVisibility(currentFlags);
同理,切换状态栏图标为灰色时,直接叠加标志即可,不影响导航栏:
int currentFlags = getWindow().getDecorView().getSystemUiVisibility(); currentFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; getWindow().getDecorView().setSystemUiVisibility(currentFlags);
方式2:用WindowInsetsController精细控制(API 29+)
Android 10及以上提供WindowInsetsController,可单独控制状态栏和导航栏图标颜色,互不干扰:
WindowInsetsController insetsController = getWindow().getInsetsController(); if (insetsController != null) { // 设置状态栏图标为灰色(深色) insetsController.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ); // 恢复状态栏图标为白色 insetsController.setSystemBarsAppearance( 0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ); // 单独设置导航栏图标颜色(比如保持灰色) insetsController.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS ); }
单独修改导航栏图标颜色(API 26+)
若需单独控制导航栏图标为灰色,可使用SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR标志,可与状态栏标志组合使用:
// 同时设置状态栏和导航栏图标为灰色 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR );
内容的提问来源于stack exchange,提问作者user18504539
相关产品推荐
相关产品推荐

