Comment désactiver un bouton Android?

j'ai créé une mise en page qui contient deux boutons, Next et Previous. Entre les boutons, je génère des vues dynamiques. Alors quand j'ai lancer l'application, je souhaite désactiver le bouton "Précédent" car il n'y aura point de vue précédent. Je veux aussi désactiver le bouton" Suivant " quand il n'y a plus de vues à afficher. Est-il de toute façon à désactiver les boutons?

screen shot of sample <a href=layout" src="/images/content/4384890/fc9dd026964d1bfe7bb2496b58a4fd54.jpg">

300
demandé sur Adrian Toman 2010-12-08 09:48:53

9 réponses

Avez-vous essayé?

myButton.setEnabled(false); 

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

667
répondu Varun 2014-09-01 19:00:54

vous ne pouvez pas l'activer ou le désactiver dans votre XML (puisque votre layout est défini à l'exécution), mais vous pouvez définir si elle est cliquable au lancement de l'activité avec android:clickable .

45
répondu Gwen 2014-09-01 19:02:39

vous n'écrivez qu'une seule ligne de code dans votre activité

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

quand vous voulez activer le même bouton il suffit d'écrire

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
30
répondu Deepak Sharma 2014-09-01 19:01:35

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 voulez désactiver le bouton depuis le début, vous pouvez utiliser bouton.setEnabled(false); dans la méthode onCreate. Sinon, à partir de XML, vous pouvez utiliser directement:

android:clickable = "false"

:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />
20
répondu Paolo Rovelli 2013-09-11 16:18:01

Oui il peut être désactivé en XML juste à l'aide de <Button android:enabled="false" />

14
répondu Mulaffer 2017-12-20 12:31:59

dans mon cas,

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

fonctionne bien et il est activer et désactiver le bouton comme il se doit. Mais une fois que l'état du bouton est désactivé, il ne retourne plus jamais à l'état activé, bien qu'il soit cliquable. J'ai essayé d'invalider et de rafraîchir l'état de tirage, mais pas de chance.

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

si vous ou n'importe qui ayant un problème semblable, ce qui fonctionne pour moi est de mettre le dessin de fond à nouveau. Fonctionne à n'importe quel niveau de L'API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
7
répondu ayorhan 2012-12-14 15:12:20

dans Kotlin, si vous référez la vue de bouton avec id puis, Activer / Désactiver bouton comme comme

mise en page.xml

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

de l'activité.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button
3
répondu Sackurise 2017-11-15 12:04:19

premier en xml faire le bouton comme android:clickable="false"

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

puis dans votre code, à l'intérieur de oncreate() méthode définir la propriété bouton comme

btn.setClickable(true);

puis dans le bouton cliquez 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);

        }
    });
}
1
répondu rajeesh 2014-10-06 10:28:45

WRONG WAY IN LISTENER TO USE VARIABLE INSTEAD OF PARAMETER!!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

DROIT CHEMIN:

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 définition de L'Interface pour qu'un rappel soit invoqué lorsqu'une vue est cliquée.

avec définition de la méthode

void onClick(View v);

quand la vue est cliquée l'objet de classe de vue fait appel à la méthode onClick () en envoyant en tant que paramètre lui-même, donc le paramètre de vue nulle ne devrait pas se produire s'il le fait c'est une erreur D'Assertion cela pourrait se produire par exemple quand la classe d'objet de vue a été détruite en attendant (par exemple collecté par GC) ou la méthode a été altérée en raison de piratage

peu au sujet de instanceof & null

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

à l'exécution, le résultat de l'instanceof operator est vrai si la valeur de la relation expression n'est pas nulle et la référence pourrait être faite au type de référence sans élever une ClassCastException.

sinon le résultat est faux .


trois mots de l'auteur

SI VOUS DEMANDEZ POURQUOI ?

la plupart du temps pour éviter NullPointerException

un peu plus de code vous fera gagner du temps sur le suivi des bogues plus tard dans votre code et réduit la fréquence des anomalies.

prenons l'exemple suivant:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
1
répondu ceph3us 2016-07-26 23:55:21