【问题标题】:Tint Navigation Icon in Toolbar工具栏中的色调导航图标
【发布时间】:2018-02-05 20:09:15
【问题描述】:

如何给菜单图标着色已经介绍过几次了,比如这里: Toolbar icon tinting on Android

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

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

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

【问题讨论】:

    标签: android icons android-toolbar tint


    【解决方案1】:

    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 (&lt;selector&gt;) 资源值将导致 @ 987654333@ 被抛出。如果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 的支持库版本时遇到问题,您只需关注上述注意事项。

    【讨论】:

    • 成功了!请注意,这有点令人困惑,因为答案给出了&lt;item name="tint"&gt;&lt;item name="android:tint"&gt; 的示例,但只是在第一个示例中看到的&lt;item name="tint"&gt; 可以正常工作!谢谢迈克!
    • 第二部分的sn-ps只适用于支持低于25.4.0的库版本。目前,您不太可能使用这么旧的版本。如果要坚持使用这样的旧版本,则必须使用平台名称空间中的平台tint 属性,因此使用android 前缀– android:tint。对于较新的版本,包括 androidx,您使用库的 tint 属性,该属性位于您的应用程序的命名空间中,因此没有前缀 - 只是 tint。我试图用水平规则清楚地描述这些单独的解决方案。抱歉,如果不清楚。
    • 你是最棒的@MikeM。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2015-05-07
      • 2014-12-18
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多