使用ColorStateList色调值使ImageView/ImageButton膨胀时出错

Mat*_*out 5 android tint android-appcompat imageview android-4.4-kitkat

使用ImageView/ ImageButton(AppCompatImageView/ AppCompatImageButton),其与一个风格属性的结合android:tint,这使得使用的ColorStateList资源工作在> = API 21细,但将引发InflateException对API <21.

首先,我甚至不知道AppCompatImageView / (Button)着色是否支持ColourStateListxml资源作为android:tint值,我似乎无法找到明确的答案.我可以在S/O上找到的建议建议实现TintableImageView等,但是这些答案已经过时了,而且从appcompat实现的来源看来,这应该是一个功能.

澄清这绝对是个问题.删除android:tint属性或将其设置为单个颜色资源有效.

另外要澄清一下,我知道这是可以通过编程实现的.我试图让它在xml中向后兼容.

最小的例子

activity_foo.xml

<android.support.v7.widget.AppCompatImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_caret_up"
                style="@style/IconButton.Primary"

/>
Run Code Online (Sandbox Code Playgroud)

styles.xml

<style name="IconButton.Primary">
    <item name="android:tint">@color/link_button_color</item>
</style>
Run Code Online (Sandbox Code Playgroud)

link_button_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:color="@color/btnLinkPressedTextColor"
      android:state_selected="true" />
  <item android:color="@color/btnLinkPressedTextColor"
      android:state_pressed="true" />
  <item android:color="@color/btnLinkTextColor" />

</selector>
Run Code Online (Sandbox Code Playgroud)

Jak*_*eam 2

看起来 AppCompat 可绘制着色仅适用于 < API 21 上的操作栏和“某些小部件”,但适用于 API 21+ 上的所有可绘制。

当您设置这些属性时,AppCompat 会自动将它们的值传播到 API 21+ 上的框架属性。这会自动为状态栏和概述(最近)任务条目着色。

在较旧的平台上,AppCompat 会尽可能模拟颜色主题。目前,这仅限于为操作栏和一些小部件着色。

来源: https: //android-developers.googleblog.com/2014/10/appcompat-v21-material-design-for-pre.html

这里的答案也有更多细节:/sf/answers/2040892801/