web-dev-qa-db-fra.com

Comment griser un bouton?

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

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>
93
jul

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 de la mise au point
  4. État activé (État désactivé avec indication fausse; voir les commentaires)

Vous fournissez un effet et un fond aux États en conséquence.

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

53
Adil Soomro

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

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

mise à jour: J'ai écrit cette pré-Kotlin et quand j'étais une recrue. C'est plus une solution "quick'n'dirty", mais je ne le 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)
}

Dans Java vous pouvez faire quelque chose de similaire avec une fonction util statique et il vous suffirait de passer la vue sous forme de variable. Ce n'est pas aussi clair mais ça marche.

147
Siavash

La solution la plus simple consiste à définir le filtre de couleur sur l'image d'arrière-plan d'un bouton, comme je l'ai constaté 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 que j'ai aidé quelqu'un ...

49
Woody

Toutes les réponses données fonctionnent bien, mais je me souviens avoir appris que l’utilisation de setAlpha pouvait être une mauvaise idée sage performance (plus d’informations ici ). Donc, créer un StateListDrawable est une meilleure idée pour gérer l’état désactivé des boutons. Voici comment:

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

<!-- Disable background -->
<item Android:state_enabled="false"
      Android:color="@color/md_blue_200"/>

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

Créez 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>

Puis appliquez 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, lorsque vous appelez btnBlue.setEnabled(true) OR btnBlue.setEnabled(false)), les couleurs de l’état changeront automatiquement.

14
Ali Kazi

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>

Ajouter le sélecteur à votre bouton

<style name="srp_button" parent="@Android:style/Widget.Button">
    <item name="Android:background">@drawable/btn_selector</item>
</style>
11
Willy Chen

Définissez Clickable sur false et changez la couleur de fond comme suit:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));
11
Saty
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
3
Leon van Noord

J'ai utilisé ce code pour ça:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);
1
e-nature

vous pouvez faire une image grise et la mettre dans votre dessinable et l'ajouter à votre code.

button.setBackgroundResource(R.drawable.grey);

facile, simple, mais à cause de l'image, cela prend un peu plus d'espace.

0