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

Android Studio中如何修改导航栏图标的颜色?

解决导航栏图标颜色问题的可行方案

这个问题我之前帮不少开发者捋清楚过,核心是不同Android版本的适配逻辑差异很大,下面分情况给你具体操作方案:

一、Android 8.0(API 26)及以上版本(推荐官方方案)

从Android 8.0开始,系统提供了直接的主题属性来控制导航栏图标颜色,操作非常简单:

  1. 静态配置(主题文件中设置)
    在你的styles.xml或themes.xml主题样式里添加以下属性:
<item name="android:windowLightNavigationBar">true</item>

当这个属性设为true时,导航栏的返回、主页等图标会自动切换为深色(黑色),前提是你的导航栏背景色是浅色(和图标有足够对比度)。

  1. 动态切换(代码中控制)
    如果需要根据页面场景动态切换图标颜色,比如随背景色变化,可以在Activity中这样写:
// Kotlin示例
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

或者Java版本:

// Java示例
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

二、Android 6.0(API 23)到Android 7.1(API 25)版本

这个区间的系统没有公开API控制导航栏图标颜色,只能通过反射修改系统内部参数,具体代码如下:

Kotlin实现:

fun setNavigationBarIconColor(window: Window, isLightIcon: Boolean) {
    val decorView = window.decorView
    val currentUiVisibility = decorView.systemUiVisibility
    try {
        val lightNavFlagField = View::class.java.getField("SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR")
        val lightFlag = lightNavFlagField.getInt(null)
        decorView.systemUiVisibility = if (isLightIcon) {
            currentUiVisibility or lightFlag
        } else {
            currentUiVisibility and lightFlag.inv()
        }
    } catch (e: Exception) {
        // 反射失败时的容错处理,比如不做操作或提示用户
        e.printStackTrace()
    }
}

// 在Activity中调用:设置为深色图标
setNavigationBarIconColor(window, true)

Java实现:

public static void setNavigationBarIconColor(Window window, boolean isLightIcon) {
    View decorView = window.getDecorView();
    int currentUiVisibility = decorView.getSystemUiVisibility();
    try {
        Field lightNavFlagField = View.class.getField("SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR");
        int lightFlag = lightNavFlagField.getInt(null);
        if (isLightIcon) {
            decorView.setSystemUiVisibility(currentUiVisibility | lightFlag);
        } else {
            decorView.setSystemUiVisibility(currentUiVisibility & ~lightFlag);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

// 在Activity中调用:设置为深色图标
setNavigationBarIconColor(getWindow(), true);

注意:反射属于非官方API,部分定制ROM可能不支持,建议添加容错处理。

三、Android 5.0(API 21)到Android 5.1(API 22)版本

这个版本的导航栏图标颜色由系统自动判断:会根据导航栏背景色的亮度,自动切换为黑色或白色。如果你的浅色背景下图标没变黑,可能是系统对比度判断逻辑的问题,可以尝试微调导航栏背景色的亮度,让系统识别为浅色背景,从而自动切换图标颜色。

额外注意事项

  • 确保你的主题继承自Theme.MaterialComponents.*或Theme.AppCompat.*,避免主题不兼容导致属性失效。
  • 同时设置android:navigationBarColor和android:windowLightNavigationBar时,要保证两者对比度足够,符合无障碍设计要求。

内容的提问来源于stack exchange,提问作者johanjohansson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:46:47