android 着色导航图标中

ecr0jaav  于 2023-10-14  发布在  Android
关注(0)|答案(3)|浏览(117)

如何给菜单图标着色已经介绍过几次了,就像这里:Toolbar icon tinting on Android
除了这个解决方案之外,还有导航图标的问题。将主题(叠加)应用到您的屏幕上只会使文本和白名单图标着色(请参阅:https://stackoverflow.com/a/26817918/2417724
如果你设置了一个自定义图标(这是很容易的情况下,因为你需要改变它,如果你不想显示默认的后退箭头),那么这个自定义图标不会着色。
那你怎么处理你的图标呢?我所有的图标都默认为黑色,我不想有特殊的白色版本,只是为了使用它们在屏幕上。

e4eetjau

e4eetjau1#

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或更低版本,则必须使用platform android:tint属性。
不幸的是,这导致了另一个问题,即Lollipop(API级别21)之前的平台tint只能处理简单的单色值,并且使用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,则只需要关注上面的注解。

lg40wkob

lg40wkob2#

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

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

ca1c2owp3#

你可以试着给图标上色

toolbar.getNavigationIcon().setTint(getColor(R.color.white));

相关问题