web-dev-qa-db-fra.com

Comment ajouter une teinte de bouton par programmation

Dans la nouvelle bibliothèque AppCompat, nous pouvons colorer le bouton de la manière suivante:

<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"
    />

Comment définir la teinte du bouton par programmation dans mon code? J'essaye fondamentalement d'implémenter une coloration conditionnelle du bouton basée sur une entrée d'utilisateur.

81
Stephane

Selon la documentation , la méthode associée à Android:backgroundTint est setBackgroundTintList (liste ColorStateList)

Mettre à jour

Suivez ceci lien pour savoir comment créer une ressource de liste d'états de couleurs.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item
        Android:color="#your_color_here" />
</selector>

puis chargez-le avec

setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name));

contextInstance est une instance d'un Context


en utilisant AppCompart

btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));
113
ColdFire

Vous pourriez utiliser

button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));

Mais je vous recommanderais d’utiliser une bibliothèque d’aide à la coloration imprimable qui vient d’être publiée hier:

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

Vous pouvez trouver plus dans cet article de blog (voir la section "Teinture dessinable")

61
dimsuz

On dirait que les vues ont leurs propres mécanismes de gestion de la teinte, il sera donc préférable de mettre la liste de teintes:

ViewCompat.setBackgroundTintList(
    editText, 
    ColorStateList.valueOf(errorColor));
46
tse

Pour étendre correctement la réponse de dimsuz en fournissant une situation de code réelle, consultez l'extrait de code suivant:

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

Cette solution concerne le scénario dans lequel un dessinable est utilisé comme arrière-plan du bouton. Cela fonctionne aussi sur les appareils pré-Lollipop.

14
Seni Joshua

Avez-vous essayé quelque chose comme ça?

button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100));

notez que getResources () ne fonctionnera que dans une activité. Mais on peut aussi faire appel à tous les contextes.

7
Chris K.

Vous pouvez utiliser DrawableCompat, par exemple.

public static Drawable setTint(Drawable drawable, int color) {
    final Drawable newDrawable = DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(newDrawable, color);
    return newDrawable;
}
5
mac229

J'avais un problème similaire. Je souhaitais colorer un arrière-plan dessinable complexe pour une vue basée sur une valeur de couleur (int). J'ai réussi en utilisant le code:

ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);

Où couleur est une valeur int représentant la couleur requise. Ceci représente le simple XML ColorStateList:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:color="color here"/>
</selector>

J'espère que cela t'aides.

3
Show your working

J'ai réussi à faire fonctionner le mien en utilisant CompoundButtonCompat.setButtonTintList(button, colour).

À ma connaissance, cela fonctionne quelle que soit la version de Android.

2
Matt Jenje

ceci est facilement géré dans le nouveau bouton Matériau de la bibliothèque de conception de matériaux, ajoutez d'abord la dépendance:

implementation 'com.google.Android.material:material:1.1.0-alpha07'

puis dans votre XML, utilisez ceci pour votre bouton:

<com.google.Android.material.button.MaterialButton
    Android:id="@+id/accept"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/i_accept"
    Android:textSize="18sp"
    app:backgroundTint="@color/grayBackground_500" />

et lorsque vous souhaitez modifier la couleur, voici le code dans Kotlin, il n'est pas obsolète et peut être utilisé avant Android 21:

accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, 
R.color.colorPrimary, theme))
1

Pour ImageButton, vous pouvez utiliser:

favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
1
Saurabh Singh

La réponse suggérée ici ne fonctionne pas correctement sur Android 5.0 si votre liste d'état de couleur basée sur XML fait référence à des attributs thématiques. Par exemple, j'ai une liste d'état de couleur xml comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="?colorPrimary" Android:state_enabled="true"/>
    <item Android:alpha="0.12" Android:color="?attr/colorOnSurface"/>
</selector>

Utiliser ceci comme backgroundTint from xml fonctionne très bien sur Android 5.0 et tout le reste. Cependant, si j'essaie de définir ceci dans un code comme celui-ci:

(ne faites pas ceci)

myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

En fait, peu importe si je passe l'activité ou le contexte du bouton à la méthode ContextCompat.getColorStateList (), ni me donnera la liste d'état de couleurs appropriée en ce qui concerne le thème dans lequel se trouve le bouton. En effet, l'utilisation d'attributs de thème dans les listes d'états de couleurs n'était pas prise en charge jusqu'à ce que api 23 et ContextCompat ne fassent rien de spécial pour les résoudre. Au lieu de cela, vous devez utiliser AppCompatResources.getColorStateList () qui effectue sa propre résolution d’analyse de ressources/attribut de thème sur les périphériques <API 23.

À la place, vous devez utiliser ceci:

myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

TLDR: utilisez AppCompatResources et non -ContextCompat- si vous avez besoin de ressources à thème résolues dans toutes les versions d'API d'Android.

Pour plus d'informations sur le sujet, voir cet article .

0
Matt Wolfe