Ответ 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);
}
}