工具栏中的色调导航图标

cwi*_*ner 12 icons android tint android-toolbar

如何着色菜单图标已经覆盖了几次,例如: Android上的工具栏图标着色

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

如果您设置了一个自定义图标(这种情况非常简单,如果您不想显示默认的后退箭头,则需要更改它),则此自定义图标不会显示.

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

Mik*_* M. 23

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>
Run Code Online (Sandbox Code Playgroud)

使用此方法时需要注意几点.

在支持库版本25.4.0之前,AppCompatImageButton没有提供自己的tint属性,因此tint应用程序命名空间中的属性将不适用(除非在别处定义,否则将不存在).android:tint如果使用支持库版本25.3.0或更早版本,则必须使用platform 属性.

不幸的是,这导致另一个问题,因为Lollipop之前的平台色调(API级别21)只能处理简单的单色值,并且使用ColorStateList(<selector>)资源值将导致Exception抛出.如果android:tint值是简单的颜色,这不会产生任何问题,但通常需要着色导航图标以匹配另一个主题颜色属性,这可能很好ColorStateList.在这种情况下,有必要在res/values/和中创建单独的样式,res/values-21/android:tintin 指定一个简单的颜色值res/values/.

例如,如果着色以匹配主题的主要文本颜色:

res/values/styles.xml

<item name="android:tint">@color/normal_text_color</item>
Run Code Online (Sandbox Code Playgroud)

res/values-v21/styles.xml

<item name="android:tint">?android:textColorPrimary</item>
Run Code Online (Sandbox Code Playgroud)

如果您使用的支持库版本低于25.4.0,则只需关注上述注释即可.