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.
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));
où contextInstance
est une instance d'un Context
en utilisant AppCompart
btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));
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")
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));
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.
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.
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;
}
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.
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.
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))
Pour ImageButton, vous pouvez utiliser:
favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
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 .