Cómo agregar tinte de botón mediante programación
En la nueva biblioteca AppCompat, podemos teñir el botón de esta manera:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow"
android:id="@+id/button_follow"
android:backgroundTint="@color/blue_100"
/>
¿Cómo puedo configurar el tono del botón programáticamente en mi código? Básicamente estoy tratando de implementar un color condicional del botón basado en alguna entrada del usuario.
9 answers
De acuerdo con la documentación el método relacionado con android:backgroundTint
es setBackgroundTintList (ColorStateList list)
Update
Siga este enlace para saber cómo crear un recurso de Lista de Estados de Color.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="#your_color_here" />
</selector>
Luego cárguelo usando
setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name));
Donde contextInstance
es una instancia de un Context
Usando AppCompart
btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 12:01:28
Podrías usar
button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));
Pero te recomendaría utilizar una biblioteca de soporte de tintado de elementos de diseño que acaba de ser lanzado ayer:
Drawable drawable = ...;
// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);
// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);
Puedes encontrar más en esta entrada del blog (ver sección "Tintado de elementos de diseño")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-22 15:08:40
Parece que las vistas tienen sus propias mecánicas para la gestión de tintes, por lo que mejor se pondrá la lista de tintes:
ViewCompat.setBackgroundTintList(
editText,
ColorStateList.valueOf(errorColor));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-06 03:30:20
Para extender correctamente la respuesta de dimsuz proporcionando una situación de código real, consulte el siguiente fragmento de código:
Drawable buttonDrawable = button.getBackground();
buttonDrawable = DrawableCompat.wrap(buttonDrawable);
//the color is a direct color int and not a color resource
DrawableCompat.setTint(buttonDrawable, Color.RED);
button.setBackground(buttonDrawable);
Esta solución es para el escenario donde se usa un elemento de diseño como fondo del botón. También funciona en dispositivos pre-piruleta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 15:14:28
Puede usar DrawableCompat, por ejemplo,
public static Drawable setTint(Drawable drawable, int color) {
final Drawable newDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(newDrawable, color);
return newDrawable;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 13:18:58
¿has probado algo como esto?
button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100));
Tenga en cuenta que getResources() solo funcionará en una actividad. Pero también puede invocarse en cualquier contexto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-22 14:45:46
Tuve un problema similar. Deseaba colorear un fondo de dibujable complejo para una vista basada en un valor de color (int). Tuve éxito usando el código:
ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);
Donde color es un valor int que representa el color requerido. Esto representa la simple lista xml ColorStateList:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="color here"/>
</selector>
Espero que esto ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 18:42:54
La forma en que logré que la mía funcionara fue usando CompoundButtonCompat.setButtonTintList(button, colour)
.
A mi entender esto funciona independientemente de la versión de Android.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-16 06:30:30
Para ImageButton puedes usar:
favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 12:57:02