android - El tintado DrawableCompat no funciona en pre-Lollipop
(1)
Estoy usando el nuevo TextInputLayout para ajustar un EditText. Cuando determino que un campo tiene un error, hago lo siguiente:
Drawable drawable = DrawableCompat.wrap(getEditText().getBackground());
DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED));
Esto funciona en 5.0 y convierte el subrayado en rojo, pero no hace nada en los dispositivos de prueba 4.4 o 4.1. ¿Que me estoy perdiendo aqui? Parece tan simple y según Google "simplemente funciona" ... estoy bastante seguro de que también tengo la última versión de la misma:
compilar ''com.android.support:design:22.2.0''
FWIW, si configuroColorFilter en lugar de setTint, entonces funciona en todas las plataformas, pero luego tengo problemas con el hecho de que se va y no regresa tan pronto como se establece el foco / left / etc ... Preferiría hacerlo con tinte (y realmente prefiero que el tinte se aplique a los estados de enfoque y no enfoque si alguien está buscando crédito extra, lol)
¡Gracias!
Cuando llama a wrap()
, el Drawable
original se envuelve internamente en un nuevo DrawableWrapper
que se utiliza para implementar el tinte en dispositivos más antiguos. Para que funcione, debe volver a establecer el Drawable
devuelto en EditText
:
final Drawable originalDrawable = editText.getBackground();
final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(Color.RED));
editText.setBackground(wrappedDrawable);
Desde la versión 23.2.0 de la biblioteca de soporte, también puede usar setTint()
lugar de setTintList()
para establecer solo un color de tinte sin tener que crear una ColorStateList
.
DrawableCompat.setTint(wrappedDrawable, Color.RED);
Si desea garantizar la compatibilidad con versiones anteriores más allá del nivel API 16, se encontrará con un pequeño inconveniente. setBackground()
se agregó en API nivel 16 y necesita llamar a setBackgroundDrawable()
en dispositivos antes de eso. Lo mejor es implementar un método de ayuda que lo haga por usted:
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);
}
}