Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error inflating ImageView / ImageButton with ColorStateList tint value

Using an ImageView / ImageButton (AppCompatImageView / AppCompatImageButton) in conjunction with a style attribute of android:tint which makes use of a ColorStateList resource works fine on >= API 21, but throws an InflateException on API < 21.

Firstly, I don't even know whether the AppCompatImageView / (Button) tinting supports ColourStateList xml resources as an android:tint value, I can't seem to find a definitive answer to this. Suggestions I can find on S/O suggest implementing a TintableImageView etc, but these answers are quite dated, and it seems from the source of the appcompat implementations this should be a feature.

To clarify this is definitely the issue. Removing the android:tint attribute or setting it to a single colour resource works.

Also to clarify, I'm aware this is achievable programmatically. I'm trying to get it backwards compatible in xml.

Minimal example

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>
like image 400
Matthew Trout Avatar asked May 05 '17 09:05

Matthew Trout


2 Answers

In my case i replaced android:tint with app:tint and added to root element xmlns:app="http://schemas.android.com/apk/res-auto". It fixed crashing issue on API level < 21.

And color state selector /res/color/color_selector.xml looks like:

<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>
like image 178
nurmat Avatar answered Oct 12 '22 23:10

nurmat


It looks like AppCompat drawable tinting only works for action bar and "some widgets" on < API 21, but works for all drawables on API 21+.

When you set these attributes, AppCompat automatically propagates their values to the framework attributes on API 21+. This automatically colors the status bar and Overview (Recents) task entry.

On older platforms, AppCompat emulates the color theming where possible. At the moment this is limited to coloring the action bar and some widgets.

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

The answer here also has more detail: https://stackoverflow.com/a/29155611/608312

like image 37
Jake Lee Avatar answered Oct 13 '22 01:10

Jake Lee