DrawableCompat着色对前Lollipop不起作用

时间:2015-06-16 15:35:13

标签: android drawable tint

我正在使用新的TextInputLayout来包装EditText。当我确定某个字段有错误时,我会执行以下操作:

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

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

这适用于5.0并将下划线变为红色,但在4.4或4.1测试设备上不执行任何操作。我在这里错过了什么?看起来如此简单,根据谷歌“正常工作”...相当肯定我也有它的最新版本:

编译'com.android.support:design:22.2.0'

FWIW,如果我使用setColorFilter而不是setTint,那么它可以在所有平台上运行但是我有问题就会消失,一旦焦点设置/左/等等就不会回来......我更愿意用色调做(并且如果有人在寻找额外的信用,我真的更喜欢将色调应用于焦点和非焦点状态)

谢谢!

1 个答案:

答案 0 :(得分:66)

当您致电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的向后兼容性,你会遇到一些麻烦。 API级别16中添加了setBackground(),您需要先在设备上调用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);
    }
}