工具栏中的导航图标着色

问题描述 投票:0回答:3

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

除了这个解决方案之外,还存在导航图标的问题。 将主题(覆盖)应用到工具栏只会对文本和白名单图标进行着色(请参阅:https://stackoverflow.com/a/26817918/2417724

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

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

android icons android-toolbar tint
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)之前的平台色调只能处理简单的单一颜色值,并且使用

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 的支持库版本,则只需关注上面的注释即可。


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));
© www.soinside.com 2019 - 2024. All rights reserved.