Comment désactiver un bouton Android?

371

J'ai créé une mise en page qui contient deux boutons, Suivant et Précédent. Entre les boutons, je génère des vues dynamiques. Donc, lorsque je lance l'application pour la première fois, je souhaite désactiver le bouton "Précédent" car il n'y aura pas de vues précédentes. Je souhaite également désactiver le bouton "Suivant" lorsqu'il n'y a plus de vues à afficher. Est-il possible de désactiver les boutons?

capture d'écran de la disposition d'échantillon

Dijo David
la source

Réponses:

802

Avez-vous essayé cela?

myButton.setEnabled(false); 

Mise à jour: Merci à Gwen. Presque oublié qui android:clickablepeut être défini dans votre mise en page XML pour déterminer si un bouton peut être cliquable ou non.

Varun
la source
66
l'équivalent est android: activé en xml.
Namratha
1
Et où avez-vous trouvé cela dans la documentation? Pouvez-vous le lier ici?
Varun
4
@Namratha, cela fonctionne uniquement pour les widgets "Button", pas pour imageView as a button
mehmet
Équivalent Xamarin: myButton.Enabled = false;
Cameron Forward
48

Vous ne pouvez pas l'activer ou le désactiver dans votre XML (puisque votre mise en page est définie au moment de l'exécution), mais vous pouvez définir s'il est cliquable au lancement de l'activité avec android:clickable.

Gwen
la source
4
5 ans d'expérience dans Android et j'apprends à ce sujet MAINTENANT! : /
Sagar
35

Vous écrivez juste une seule ligne de code dans votre activité

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);

Lorsque vous souhaitez activer le même bouton, il suffit d'écrire

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
la source
20
C'est 2 lignes. C'est un. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark
34
Essayez de comprendre les sentiments de Matt ..;)
Deepak Sharma
30

Oui, il peut être désactivé en XML en utilisant simplement:

<Button
android:enabled="false"
/>
Mulaffer
la source
2
Ceci est la vraie réponse pour xml. Tout ce non-sens de jouer avec cliquable n'a rien à voir avec la façon dont le bouton est dessiné pour le rendre désactivé.
Scott Biggs
1
Je pense que les gens pensaient que vous ne pouviez pas faire cela parce que la complétion de code AS / IDEA ne suggère pas android:enabledquand vous commencez à le taper. (Même à ce jour.)
Kevin Krumwiede
1
J'ai essayé que cela ne fonctionne pas, seulement du code setEnabledfonctionne
FindOutIslamNow
23

En Java, une fois que vous avez la référence du bouton:

Button button = (Button) findviewById(R.id.button);

Pour activer / désactiver le bouton, vous pouvez utiliser soit:

button.setEnabled(false);
button.setEnabled(true);

Ou:

button.setClickable(false);
button.setClickable(true);

Puisque vous souhaitez désactiver le bouton depuis le début, vous pouvez utiliser button.setEnabled (false); dans la méthode onCreate. Sinon, à partir de XML, vous pouvez directement utiliser:

android:clickable = "false"

Donc:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />
Paolo Rovelli
la source
répondu 8 déc. 10 à 7:08 Varun
1
@Poldie: En fait, si vous lisez les deux réponses, vous comprendrez qu'elles sont assez similaires mais pas égales.
Paolo Rovelli
9

Dans mon cas,

myButton.setEnabled(false);
myButton.setEnabled(true);

fonctionne bien et il active et désactive le bouton comme il se doit. Mais une fois que l'état du bouton est désactivé, il ne revient plus jamais à l'état activé, bien qu'il soit cliquable. J'ai essayé d'invalider et d'actualiser l'état de dessin, mais pas de chance.

myButton.invalidate();
myButton.refreshDrawableState();

Si vous ou quelqu'un ayant un problème similaire, ce qui fonctionne pour moi, c'est de redessiner l'arrière-plan. Fonctionne à n'importe quel niveau d'API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
ayorhan
la source
8

Dans Kotlin, si vous faites référence à la vue des boutons avec id, activez / désactivez le bouton comme

layout.xml

<Button
   android:id="@+id/btn_start"
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="@string/start"
   android:layout_alignParentBottom="true"/>

activity.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button
Sackurise
la source
2

d'abord en xml faire le bouton comme android:clickable="false"

<Button
        android:id="@+id/btn_send"
        android:clickable="false"/>

puis dans votre code, la oncreate()méthode inside définit la propriété du bouton comme

btn.setClickable(true);

puis à l'intérieur du bouton, cliquez sur changer le code en

btn.setClickable(false);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setClickable(true);
    btnSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            btnSend.setClickable(false);

        }
    });
}
rajeesh
la source
2

MAUVAISE FAÇON DANS L'ÉCOUTEUR D'UTILISER LA VARIABLE AU LIEU DU PARAMÈTRE !!!

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

LA BONNE FAÇON:

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        /** check given view  by assertion or cast as u wish */
        if(v instance of Button) {

            /** cast */
            Button button = (Button) v;

            /** we can perform some check up */
            if(button.getId() == EXPECTED_ID) {

                /** disable view */
                button.setEnabled(false)            
                button.setClickable(false); 
            }

        } else {

             /** you can for example find desired view by root view  */
             Button bt = (Button) v.getRootView().findViewById(R.id.btId);

             /*check for button */
             if(bt!=null) {

                 /** disable button view */
                 ...
             } else {
                 /** according to @jeroen-bollen remark
                   * we made assumption that we expected a view
                   * of type button here in other any case  
                   */
                  throw new IllegalArgumentException("Wrong argument: " +
                         "View passed to method is not a Button type!");
             }
          }
       }
    });

EDIT: En réponse à @ jeroen-bollen

 View.OnClickListener 

est la définition d'interface pour un rappel à invoquer lorsqu'un utilisateur clique sur une vue.

avec définition de méthode

void onClick(View v);

lorsque la vue est cliquée, l'objet de classe View rappelle la méthode onClick () en l'envoyant comme paramètre lui-même, donc le paramètre de vue null ne devrait pas se produire s'il le fait, c'est une erreur d'assertion cela pourrait se produire par exemple lorsque la classe d'objet View a été détruite entre-temps (pour exemple collecté par GC) ou la méthode a été falsifiée en raison d'un piratage

peu sur instanceof & null

JLS / 15.20.2. Opérateur de comparaison de type instanceof

Au moment de l'exécution, le résultat de l'opérateur instanceof est vrai si la valeur de RelationalExpression n'est pas nulle et que la référence peut être convertie en ReferenceType sans déclencher une ClassCastException.

Sinon, le résultat est faux .


trois mots de l'auteur

SI VOUS DEMANDEZ POURQUOI?

SURTOUT POUR ÉVITER NullPointerException

Un peu plus de code vous fera gagner du temps lors du suivi ultérieur des bogues dans votre code et réduira l'occurrence d'anomalies.

considérez l'exemple suivant:

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
la source
2
Il semble que chaque fois que l'expression else soit appelée, le code est déjà buggé. Vous vous attendiez à un bouton mais quelque chose d'autre a été adopté. Vous devriez jeter une exception quand vest pas Button.
Jeroen
Pas tout à fait ce que je voulais dire, mais une amélioration néanmoins.
Jeroen
@JeroenBollen eelaborate s'il vous plaît :) ok je ne vois qu'une seule chose pas cohérente c'est un message d'exception sur "la mauvaise vue passée à la méthode". En plus c'est juste une tentative de montrer à quoi cela devrait ressembler.
ceph3us
Je voulais dire que lorsque la fonction elle-même reçoit null, c'est déjà un bogue et elle devrait lever une exception.
Jeroen
1

Avec Kotlin, vous pouvez faire,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Tout est possible
la source