DrawableCompat着色对前Lollipop不起作用

Jas*_* T. 37 android tint drawable

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

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

DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED));
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

Xav*_*ler 66

当你打电话时wrap(),原件Drawable被内部包装成一个新的DrawableWrapper,用于在旧设备上实现着色.因此,为了使其工作,您必须将返回的设置设置DrawableEditText:

final Drawable originalDrawable = editText.getBackground();
final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(Color.RED));
editText.setBackground(wrappedDrawable);
Run Code Online (Sandbox Code Playgroud)

从支持库的23.2.0版开始,您也可以使用setTint()而不是setTintList()仅设置一种色调而不必创建ColorStateList.

DrawableCompat.setTint(wrappedDrawable, Color.RED);
Run Code Online (Sandbox Code Playgroud)

如果你想确保超出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);
    }
}
Run Code Online (Sandbox Code Playgroud)