web-dev-qa-db-fra.com

Comment désactiver un bouton Android?

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 veux 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?

screen shot of sample layout

340
Dijo David

Avez-vous essayé cela?

myButton.setEnabled(false); 

Mise à jour: Merci à Gwen. Presque oublié que Android:clickable peut être défini dans votre présentation XML pour déterminer si un bouton peut être cliqué ou non.

743
Varun

Vous ne pouvez pas l'activer ni le désactiver dans votre XML (car votre mise en page est définie au moment de l'exécution), mais vous pouvez définir si elle est cliquable au lancement de l'activité avec Android:clickable .

47
Gwen

Vous venez d'écrire une seule ligne de code dans votre activité

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

Lorsque vous voulez activer le même bouton, écrivez simplement

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
31
Deepak Sharma

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:

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"

Alors:

<Button
        Android:id="@+id/button"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        Android:text="@string/button_text"
        Android:clickable = "false" />
24
Paolo Rovelli

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

<Button
Android:enabled="false"
/>
22
Mulaffer

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 jamais à l'état activé, bien qu'il soit cliquable. J'ai essayé d'invalider et de rafraîchir l'état dessinable, mais pas de chance.

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

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

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

Dans Kotlin, si vous vous référez à la vue des boutons avec son identifiant, activez/désactivez le bouton comme suit:

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
4
Sackurise

WRONG WAY IN LISTENER POUR UTILISER VARIABLE AU LIEU DE PARAMÈTRE !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

DROITE:

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 

is Définition de l'interface pour qu'un rappel soit appelé lorsqu'un clic est effectué sur une vue.

avec définition de la méthode

void onClick(View v);

lorsque la vue est cliquée, l'objet de la classe View appelle la méthode onClick () en l'envoyant comme paramètre, le paramètre null view ne doit donc pas exister s'il s'agit d'une erreur d'assertion cela peut se produire, par exemple, lorsque l'objet View la classe a été détruite entre-temps (par exemple, collectée par GC) ou la méthode a été falsifiée en raison d'un piratage

peu sur instanceof & null

JLS/15.20.2. Instance d'opérateur de comparaison de type

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

sinon le résultat est faux.


trois mots de l'auteur

SI U DEMANDER POURQUOI?

principalement à éviter NullPointerException

Un peu plus de code vous permettra de gagner du temps sur le suivi des bogues dans votre code et de réduire le nombre d'abnomalies.

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)  
2
ceph3us

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

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

puis dans votre code, dans la méthode oncreate(), définissez la propriété button comme

btn.setClickable(true);

puis à l'intérieur du bouton cliquez pour 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);

        }
    });
}
2
rajeesh