使用 ImageView
/ ImageButton
( AppCompatImageView
/ AppCompatImageButton
(与android:tint
的样式属性结合使用ColorStateList
资源在> = api 21上可以正常工作,但是在API上抛出InflateException
<21。
首先,我什至不知道AppCompatImageView / (Button)
着色是否支持ColourStateList
XML资源作为android:tint
值,我似乎找不到对此的确定答案。我可以在S/O上找到建议,建议实现TintableImageView
等,但是这些答案已经过时了,从AppCompat实现的来源来看,这应该是一个功能。
澄清这绝对是问题。删除android:tint
属性或将其设置为单个颜色资源。
也要澄清,我知道这是可以通过编程实现的。我正在尝试将其向后兼容。
最小示例
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"
/>
styles.xml
<style name="IconButton.Primary">
<item name="android:tint">@color/link_button_color</item>
</style>
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>
在我的情况下,我用app:tint
替换android:tint
,并添加到root Element xmlns:app="http://schemas.android.com/apk/res-auto"
中。它修复了API级别上的崩溃问题&lt;21。
和颜色状态选择器/res/color/color_selector.xml 看起来像:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#151515"/>
<item android:state_focused="true" android:color="#151515"/>
<item android:color="#424242"/>
</selector>
看起来像AppCompat可绘制的色彩仅适用于动作栏和"一些小部件"在&lt;API 21,但适用于API 21 。
上的所有可绘制物设置这些属性时,AppCompat会自动将其值传播到API 21 上的框架属性。这会自动为状态栏和概述(recents(任务条目。
在较旧的平台上,AppCompat在可能的情况下模拟了颜色主题。目前,这仅限于为动作栏和一些小部件着色。
来源:https://android-developers.googleblog.com/2014/10/appcompat-v21-material-design-design-for-pre.html
这里的答案也有更多详细信息:https://stackoverflow.com/a/29155611/608312
item name =" android:tint"是错误的。
修复" android:tint"到'tint'
<style name="IconButton.Primary">
<item name="tint">@color/link_button_color</item>
</style>