android drawable tint

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