如何对色调菜单图标进行了几次覆盖,如下所示: Toolbar icon tinting on Android
除此解决方案外,还存在导航图标的问题。 将主题(叠加)应用于工具栏只会对文本和白名单图标进行着色(请参阅:https://stackoverflow.com/a/26817918/2417724)
如果您设置了一个自定义图标(这种情况非常简单,如果您不想显示默认的后退箭头需要更改它),则此自定义图标不会着色。< / p>
那你如何处理你的图标呢? 我的所有图标都是默认的黑色,我不想在工具栏中使用特殊的白色版本。
答案 0 :(得分:17)
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/
中创建单独的样式,为android:tint
中的res/values/
指定一个简单的颜色值。
例如,如果着色以匹配主题的主要文本颜色:
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,则只需关注上述注释。
答案 1 :(得分:0)
要以编程方式有效地设置导航图标的色调颜色,您需要先设置可绘制对象,然后再应用色调。
toolbar.setNavigationIcon(R.drawable.ic_back)
toolbar.children.forEach {
(it as? AppCompatImageButton)?.imageTintList =
ColorStateList.valueOf(Color.GREEN)
it.refreshDrawableState()
}