Ошибка надувания ImageView / ImageButton со значением оттенка ColorStateList

Используя ImageView / ImageButton (AppCompatImageView / AppCompatImageButton) в сочетании с атрибутом стиля android:tint который использует ColorStateList Ресурс прекрасно работает на>= API 21, но выдает InflateException по API < 21.

Во-первых, я даже не знаю, AppCompatImageView / (Button) тонирующие опоры ColourStateList XML-ресурсы как 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"

/>

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>

3 ответа

В моем случае я заменил android:tint с app:tint и добавлен в корневой элемент xmlns:app="http://schemas.android.com/apk/res-auto", Исправлена ​​проблема с падением на уровне API < 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 работает только для панели действий и "некоторых виджетов" в

Когда вы устанавливаете эти атрибуты, AppCompat автоматически распространяет их значения на атрибуты платформы в API 21+. Это автоматически раскрасит строку состояния и запись обзора (последние).

На старых платформах AppCompat эмулирует цветовую тематику, где это возможно. На данный момент это ограничено окраской панели действий и некоторых виджетов.

Источник: https://android-developers.googleblog.com/2014/10/appcompat-v21-material-design-for-pre.html

Ответ здесь также имеет более подробную информацию: /questions/3332207/risovannyie-ottenki-dlya-api-21/3332220#3332220

item name="android:tint" неверно.

исправить "андроид: оттенок" на "оттенок"

<style name="IconButton.Primary">
    <item name="tint">@color/link_button_color</item>
</style>
Другие вопросы по тегам