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.

Author: Yvette Colomb, 2015-04-22

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));
 78
Author: ColdFire,
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")

 40
Author: dimsuz,
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));
 23
Author: tse,
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.

 6
Author: Seni Joshua,
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;
}
 5
Author: mac229,
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.

 4
Author: Chris K.,
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.

 3
Author: Show your working,
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.

 2
Author: Matt Jenje,
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
 1
Author: Saurabh Singh,
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