在工具栏中给导航图标着色

20
如何对菜单图标进行着色已经有几篇文章介绍了,比如这里:在Android上对工具栏图标进行着色
除此之外,还存在导航图标的问题。将主题(覆盖)应用于您的工具栏只会着色文本和白名单中的图标(参见:https://dev59.com/CV8d5IYBdhLWcg3weiJ-#26817918)。
如果您设置了自定义图标(这通常很容易实现,因为如果不想显示默认的返回箭头,则需要更改它),那么此自定义图标将不会被着色。
那么,您如何处理您的图标呢? 我所有的图标默认为黑色,我不想要特殊的白色版本来在工具栏中使用它们。
3个回答

39

AppCompat导航按钮 - 简单来说就是一个AppCompatImageButton - 可以通过toolbarNavigationButtonStyle属性进行样式设置。在AppCompat主题中,该按钮的默认样式为Widget.AppCompat.Toolbar.Button.Navigation,我们可以扩展该样式并添加tint属性值。例如:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...

    <item name="toolbarNavigationButtonStyle">@style/Toolbar.Button.Navigation.Tinted</item>

</style>

<style name="Toolbar.Button.Navigation.Tinted" parent="Widget.AppCompat.Toolbar.Button.Navigation">
    <item name="tint">@color/nav_button_tint</item>
</style>

使用此方法时需要注意一些要点。

在支持库版本25.4.0之前,AppCompatImageButton没有提供自己的tint属性,因此应用命名空间中的tint属性将不会应用(并且除非在其他地方定义,否则不存在)。如果使用支持库版本25.3.0或更早版本,则必须使用平台的android:tint属性。

不幸的是,这导致了另一个问题,在Lollipop(API级别21)之前的平台tint只能处理简单的单色值,并且使用ColorStateList<selector>)资源值会导致抛出异常。如果android:tint值是简单的颜色,则不会出现问题,但通常希望将导航图标着色以匹配另一个主题颜色属性,这很可能是ColorStateList。在这种情况下,需要在res/values/res/values-21/中创建单独的样式,为res/values/中的android:tint指定简单颜色值。

例如,如果想让颜色与主题的主要文本颜色相匹配:

res/values/styles.xml

<item name="android:tint">@color/normal_text_color</item>

res/values-v21/styles.xml

<item name="android:tint">?android:textColorPrimary</item>

如果您使用的支持库版本低于25.4.0,则只需要关注上面的注意事项。


成功了!请注意,这可能会有点令人困惑,因为答案给出了使用 <item name="tint"><item name="android:tint"> 的示例,但是第一个示例中仅使用 <item name="tint"> 就可以正常工作!谢谢 Mike! - Andrew Leader
第二部分中的片段仅适用于支持库版本低于25.4.0的情况。目前你使用的版本极不可能如此古老。如果被困在这样的遗留版本上,你必须使用平台的“tint”属性,该属性位于平台命名空间中,因此需要使用“android”前缀——即“android:tint”。对于包括androidx在内的新版本,你应该使用库的“tint”属性,该属性位于你的应用程序命名空间中,所以没有前缀——只需使用“tint”即可。我试图清晰地划分这些不同的解决方案,用一条横线来区分。如果不清楚,抱歉。 - Mike M.
1
你是最棒的 @MikeM。 - Robin Hood

0

为了在程序中有效地设置导航图标的色调,您需要先设置可绘制对象,然后再应用色调。

toolbar.setNavigationIcon(R.drawable.ic_back)
toolbar.children.forEach {
    (it as? AppCompatImageButton)?.imageTintList =
            ColorStateList.valueOf(Color.GREEN)
    it.refreshDrawableState()
}

0
你可以尝试给图标上色
   toolbar.getNavigationIcon().setTint(getColor(R.color.white));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接