工具栏中的色调导航图标



如何着色菜单图标已经介绍了几次,如下所示: 安卓上的工具栏图标着色

除了此解决方案之外,仍然存在导航图标的问题。 将主题(叠加)应用于工具栏只会使文本和白名单图标着色(请参阅:https://stackoverflow.com/a/26817918/2417724)

如果您设置了自定义图标(这恰好很容易,因为如果您不想显示默认的后退箭头,则需要更改它),则此自定义图标不会被着色。

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

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()
}

最新更新