129 votes

Comment griser un bouton ?

J'ai un bouton défini comme indiqué ci-dessous. Lorsque je veux le désactiver, j'utilise my_btn.setEnabled(false) mais j'aimerais aussi le griser. Comment puis-je le faire ?

Merci

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

style/srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable/btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

2 votes

195voto

Siavash Points 406

Vous pouvez également le faire apparaître comme désactivé en définissant l'alpha (le rendant semi-transparent). Cela est particulièrement utile si l'arrière-plan de votre bouton est une image et que vous ne souhaitez pas créer d'états pour celle-ci.

button.setAlpha(.5f);
button.setClickable(false);

mettre à jour : J'ai écrit la solution ci-dessus avant Kotlin et quand j'étais un débutant. Il s'agit plutôt d'une solution "rapide et sale", mais je ne la recommande pas dans un environnement professionnel.

Aujourd'hui, si je voulais une solution générique qui fonctionne sur n'importe quel bouton/vue sans avoir à créer une liste d'états, je créerais une extension Kotlin.

fun View.disable() {
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)
}

En Java, vous pouvez faire quelque chose de similaire avec une fonction utilitaire statique et il vous suffit de passer la vue comme variable. Ce n'est pas aussi propre mais cela fonctionne.

66voto

Adil Soomro Points 18868

Vous devez fournir 3 ou 4 états dans votre btn_defaut.xml comme sélecteur.

  1. État pressé
  2. État par défaut
  3. État du focus
  4. Etat activé (Etat désactivé avec fausse indication ; voir commentaires)

Vous fournirez l'effet et le contexte des états en conséquence.

Voici une discussion détaillée : Bouton Android standard avec une couleur différente

0 votes

Donc pour le griser, je dois changer la couleur du fond ET la couleur du texte dans l'état désactivé ? Il n'y a aucun moyen d'ajouter simplement un premier plan transparent ?

3 votes

Oui, ce que vous allez fournir android:state_disable="true" il affichera l'état lorsque le bouton est désactivé, de la manière la plus simple et la plus recommandée.

1 votes

Et où puis-je spécifier la couleur du texte pour l'état désactivé ? Il semble que seul un fond puisse être spécifié... J'ai posé une nouvelle question à ce sujet : stackoverflow.com/questions/8743584/

61voto

Woody Points 251

La solution la plus simple est de définir un filtre de couleur pour l'image de fond d'un bouton, comme je l'ai vu. ici

Vous pouvez faire comme suit :

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

J'espère avoir aidé quelqu'un...

0 votes

Je préfère cette approche. Merci !

2 votes

Cette approche a du potentiel, mais la couleur résultante n'est pas toujours celle que vous pensez. Par exemple, un bouton orange dont la couleur grise est multipliée donne une couleur rouge foncé, et non un orange délavé.

4 votes

Peut-être Mode.SRC_IN doit être utilisé à la place de la fonction Multiply. Voir stackoverflow.com/a/17112876/550471

36voto

Ali Kazi Points 842

Toutes les réponses données fonctionnent bien, mais je me souviens avoir appris que l'utilisation de setAlpha peut être une mauvaise idée performances (plus d'infos) ici ). Ainsi, la création d'un StateListDrawable est une meilleure idée pour gérer l'état désactivé des boutons. Voici comment :

Créez un XML btn_blue.xml dans le dossier res/drawable :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Disable background -->
    <item android:state_enabled="false"
          android:color="@color/md_blue_200"/>

    <!-- Enabled background -->
    <item android:color="@color/md_blue_500"/>
</selector>

Créer un style de bouton dans res/values/styles.xml

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

Appliquez ensuite ce style à votre bouton :

<Button
     android:id="@+id/my_disabled_button"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/BlueButton"/>

Maintenant, quand vous appelez btnBlue.setEnabled(true) OU btnBlue.setEnabled(false) les couleurs de l'état changeront automatiquement.

17voto

Willy Chen Points 201

Vous devez créer un fichier XML pour le bouton désactivé ( drawable/btn_disable.xml )

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

Et créez un sélecteur pour le bouton ( drawable/btn_selector.xml )

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" />

</selector>

Ajoutez le sélecteur à votre bouton

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X