Error inflating ImageView / ImageButton with ColorStateList tint value
Asked Answered
R

3

7

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>
Razz answered 5/5, 2017 at 9:8 Comment(3)
can you try replacing hexcode directly instead of getting it from @colorUnworldly
Does this occur when using ImageViews? #29155963Anticline
It occurs when using ImageView, ImageButton (which get replaced at compilation with their appcompat variants) or explicitly specifying their appcompat variants, as in the example I've provided.Razz
G
4

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>
Godfather answered 23/5, 2018 at 6:23 Comment(0)
A
2

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://mcmap.net/q/239234/-drawable-tinting-for-api-lt-21

Anticline answered 5/5, 2017 at 9:36 Comment(1)
Tinting itself works, and I can see it present in the source. I'm specifically talking about ColourStateList tinting, which again, seems to be present in the source, but I can't find a definition anywhere of whether this is officially supportedRazz
T
0

item name="android:tint" is wrong.

fix the 'android:tint' to 'tint'

<style name="IconButton.Primary">
    <item name="tint">@color/link_button_color</item>
</style>
Tamikotamil answered 4/9, 2017 at 8:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.