我正在使用新的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,那么它可以在所有平台上运行但是我有问题就会消失,一旦焦点设置/左/等等就不会回来......我更愿意用色调做(并且如果有人在寻找额外的信用,我真的更喜欢将色调应用于焦点和非焦点状态)
谢谢!
答案 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);
}
}