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