更改 Android 上的导航栏图标颜色

Posted

技术标签:

【中文标题】更改 Android 上的导航栏图标颜色【英文标题】:Change navigation bar icon color on Android 【发布时间】:2016-01-11 07:07:42 【问题描述】:

我需要更改 android 上的导航栏。就像下图中右侧的“轻”变体 如https://www.google.co.in/design/spec/layout/structure.html#structure-system-bars 中所述。 现在,我可以使用

更改导航栏的背景

"android:navigationBarColor"

我明白了

但似乎没有办法将按钮颜色更改为深色。

任何人都知道怎么做。

PS:

在 AOSP 中研究负责 NavigationButtons 的类时,我可以找到 NavigationBarView.java、PhoneStatusBar.java、PhoneWindowManager.java、navigation_bar.xml。

我正在考虑为导航栏按钮(如ic_sysbar_recent)获取可绘制对象的参考并更改它们的色调。但这些是私人的,我无法得到他们的参考。

另外,我看到有人使用 xposed 库来做到这一点L-NAVBAR,但我不想使用任何外部库。

【问题讨论】:

如果我错了,有人纠正我,但导航栏按钮是图标,这就是它们不会自动改变颜色的原因。要么把它们换成深色的(如果可能的话)或者试着把它们倒过来。 @showp1984 是的,我想知道更改这些图标的方法。 (KeyButtonView 按照android.googlesource.com/platform/frameworks/base/+/…) 根据developer.android.com/training/material/theme.html --> “当你自定义导航栏和状态栏时,要么让它们都透明,要么只修改状态栏。在所有其他情况下,导航栏应该保持黑色。” - 这是不可能的。 @DanielOcampo 检查问题,已经将导航栏设置为所需的颜色(白色),问题是如何更改导航栏上按钮图标的颜色。 @DeniErdyneev 是的,只是要求设计师更改设计:)。 【参考方案1】:

如果您使用 API 27 (Android 8.1) 或更高版本,您可以在您的主题中实现它:

<item name="android:windowLightNavigationBar">true</item>

您可以创建一个名为 values-v27 的文件夹,并放置一个带有浅色导航栏的主题版本(在 styles.xml 中)和上面的代码以获得深色导航栏按钮。 这样,Android 8.0 或更低版本的用户将获得标准(黑色)导航栏,而 Android 8.1 或更高版本的用户将获得带有深色按钮的白色导航栏。

【讨论】:

需要注意的是还需要设置&lt;item name="android:navigationBarColor"&gt;@color/background_material_light&lt;/item&gt; @SUPERCILEX 您可以使用任何您喜欢的颜色,而不仅仅是 background_material_light。只需确保使用浅色,因为按钮会变暗。 是的,我的意思是更清楚的是,您需要用 some 颜色指定该属性,因为我花了几分钟时间对导航栏的原因感到困惑完全黑色。 (我以为windowLightNavigationBar 会为您更改按钮颜色。) 27岁以下怎么样? @MJStudio 不可能【参考方案2】:

从 Android O 开始,它变得非常简单,您可以这样做:

View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

要使其生效,窗口必须请求 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 但不是 FLAG_TRANSLUCENT_NAVIGATION。

文档:https://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

【讨论】:

值得注意的是,这是(至少对我而言)使导航栏按钮变暗的唯一方法(在 Pie,API 28 (Pixel 2 XL) 上测试)。尽管文档 (developer.android.com/reference/android/…) 说windowLightNavigationBar XML 属性对应于View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,但它们肯定不对应。我无法使用提到的 XML 属性使导航栏按钮变暗,但我可以使用这段代码。 从代码中执行此操作适用于所有情况。 XML 属性似乎仅在您不使用系统 UI 标志时才有效,例如 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 这应该是被接受的方法..正如其他人所提到的,xml属性在某些情况下似乎很挑剔..并且仅在27+可用,而flag在26+可用 【参考方案3】:

你可以调整 windowLightNavigationBar = true/falsenavigationBarColor = @color/yourColorId

所以有4个案例,我做了一个实验:

简而言之,你不想 windowLightNavigationBar= falsenavigationBarColor=White

windowLightNavigationBar= truenavigationBarColor=Black (这将在某些设备上连接)

【讨论】:

【参考方案4】:

如果您的目标用户 Api 级别为 27 或更高,请在您的 AppTheme 中使用此行

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">       
    <item name="android:windowBackground">@color/your_color</item>                
</style>

但如果您的目标用户 api 级别低于 27 或更高,您可以使用这些行

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">       
    <item name="android:windowBackground">@color/your_color</item>
    <item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>            
</style>

通过这样做,API 级别 27 或更高的用户会更改底部导航图标的颜色,但 API 级别低于 27 的用户无法享受这些功能

【讨论】:

【参考方案5】:

只需在应用运行时添加这一行就可以了

val navView: BottomNavigationView = findViewById(R.id.nav_view)
    navView.itemIconTintList = null

【讨论】:

BottomNavigationView 与系统底部导航栏不同。

以上是关于更改 Android 上的导航栏图标颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 RN 和 expo 更改 android 上的导航栏?

Android 更改导航栏颜色及隐藏导航栏

Android 更改导航栏颜色及隐藏导航栏

png中的图标用于底部导航栏android

Android棒棒糖更改导航栏颜色

如何根据主题更改状态栏/导航栏颜色/亮度?