DrawableCompat着色在前棒棒糖上不起作用

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

Drawable drawable = DrawableCompat.wrap(getEditText().getBackground()); DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED)); 

这适用于5.0,并将下划线变成红色,但在4.4或4.1testing设备上不做任何事情。 我在这里错过了什么? 似乎很简单,根据谷歌“只是作品”…非常确定,我也有最新版本:

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

FWIW,如果我做setColorFilter而不是setTint,那么它适用于所有的平台,但我有它的问题离开,并没有回来,只要焦点设置/左/等…我宁愿这样做色调(如果有人正在寻找额外的信贷,真的更喜欢把色彩应用于焦点和非焦点状态)

谢谢!

当你调用wrap() ,原来的Drawable被内部包装到一个新的DrawableWrapper ,该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()来设置一个色调颜色,而无需创buildColorStateList

 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); } }