更改 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 或更高版本的用户将获得带有深色按钮的白色导航栏。
【讨论】:
需要注意的是还需要设置<item name="android:navigationBarColor">@color/background_material_light</item>
。
@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_NAVIGATION
或 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
。
这应该是被接受的方法..正如其他人所提到的,xml属性在某些情况下似乎很挑剔..并且仅在27+可用,而flag在26+可用
【参考方案3】:
你可以调整
windowLightNavigationBar = true/false
和
navigationBarColor = @color/yourColorId
所以有4个案例,我做了一个实验:
简而言之,你不想
windowLightNavigationBar= false
而navigationBarColor=White
或
windowLightNavigationBar= true
而navigationBarColor=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 上的导航栏图标颜色的主要内容,如果未能解决你的问题,请参考以下文章