Подтвердить что ты не робот

Рисование DrawableCompat не работает на pre-Lollipop

Я использую новый TextInputLayout для переноса EditText. Когда я определяю, что у поля есть ошибка, я делаю следующее:

Drawable drawable = DrawableCompat.wrap(getEditText().getBackground());

DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED));

Это работает на 5.0 и включает красную подсветку, но ничего не делает на 4.4 или 4.1 тестовых устройствах. Что мне здесь не хватает? Кажется, это так просто и, по словам Google, "просто работает"... я уверен, что у меня есть и последняя версия:

compile 'com.android.support:design:22.2.0'

FWIW, если я устанавливаю setColorFilter вместо setTint, то он работает на всех платформах, но потом у меня проблемы с его уходом и не возвращаются, как только фокус установлен/левый/и т.д. Я бы предпочел сделайте это с оттенком (и действительно предпочитайте, чтобы оттенок применялся к фокусу и нефокусным состояниям, если кто-то ищет дополнительный кредит lol)

Спасибо!

4b9b3361

Ответ 1

Когда вы вызываете wrap(), исходный Drawable обернут внутренне в новый DrawableWrapper, который используется для реализации тонирования на старых устройствах. Чтобы заставить его работать, вы должны вернуть возвращенный Drawable в EditText:

final Drawable originalDrawable = editText.getBackground();
final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(Color.RED));
editText.setBackground(wrappedDrawable);

Начиная с версии 23.2.0 библиотеки поддержки вы также можете использовать setTint() вместо setTintList(), чтобы установить только один цвет оттенка, не создавая ColorStateList.

DrawableCompat.setTint(wrappedDrawable, Color.RED);

Если вы хотите обеспечить обратную совместимость выше уровня API 16, вы столкнетесь с небольшим запахом. setBackground() был добавлен в уровень API 16, и вам нужно позвонить setBackgroundDrawable() на устройства до этого. Лучше всего реализовать вспомогательный метод, который сделает это для вас:

public static void setBackground(View view, Drawable background) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        view.setBackground(background);
    } else {
        view.setBackgroundDrawable(background);
    }
}