工具栏中的色调导航图标

Tint Navigation Icon in Toolbar

如何给菜单图标着色已经讲过几次了,就像这里:

除此解决方案外,还有导航图标的问题。 将主题(覆盖)应用到您的工具栏只会对文本和列入白名单的图标进行着色(参见:)

如果您设置了一个自定义图标(这种情况恰好很简单,因为如果您不想显示默认的后退箭头则需要更改它)那么这个自定义图标不会被着色。

那你是怎么处理你的图标的? 我所有的图标默认都是黑色的,我不想有特殊的白色版本只是为了在工具栏中使用它们。

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)只能处理简单的单一颜色值,并且使用 ColorStateList<selector>) 资源值将导致抛出 Exception。如果 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 的支持库版本,您只需要关注上面的注释。

要以编程方式有效地设置导航图标的色调,您需要先设置可绘制对象,然后再应用色调。

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