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>
Vous devez fournir 3 ou 4 états dans votre btn_defaut.xml
comme sélecteur.
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
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.
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 ...
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.
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>
Définissez Clickable sur false et changez la couleur de fond comme suit:
callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);
J'ai utilisé ce code pour ça:
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);
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.