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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20