Come disabilitare un pulsante Android?


371

Ho creato un layout che contiene due pulsanti, Successivo e Precedente. Tra i pulsanti sto generando alcune viste dinamiche. Quindi al primo avvio dell'applicazione voglio disabilitare il pulsante "Precedente" poiché non ci saranno viste precedenti. Voglio anche disabilitare il pulsante "Avanti" quando non ci sono più visualizzazioni da visualizzare. Esiste un modo per disabilitare i pulsanti?

schermata del layout del campione

Risposte:


802

Hai provato questo?

myButton.setEnabled(false); 

Aggiornamento: grazie a Gwen. Quasi dimenticato che android:clickablepuò essere impostato nel layout XML per determinare se un pulsante può essere cliccabile o meno.


66
l'equivalente è Android: abilitato in XML.
Namratha,

1
E dove l'hai trovato nella documentazione? Puoi collegarlo qui?
Varun,

4
@Namratha funziona solo per i widget "Button", non per imageView come pulsante
mehmet

Equivalente Xamarin: myButton.Enabled = false;
Cameron Forward,

48

Non è possibile abilitarlo o disabilitarlo nel proprio XML (poiché il layout è impostato in fase di esecuzione), ma è possibile impostare se è selezionabile all'avvio dell'attività con android:clickable.


4
5 anni di esperienza in Android e me ne rendo conto ORA! : /
Sagar

35

Devi solo scrivere una singola riga di codice nella tua attività

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

Quando vuoi abilitare lo stesso pulsante basta scrivere

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

20
Sono 2 righe. Questo è uno. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark,

34
Cerca di capire i sentimenti di Matt ..;)
Deepak Sharma,

30

Sì, può essere disabilitato in XML semplicemente usando:

<Button
android:enabled="false"
/>

2
Questa è la vera risposta per XML. Tutta questa assurdità di scherzare con i clic non ha nulla a che fare con il modo in cui il pulsante viene disegnato per renderlo disabilitato.
Scott Biggs,

1
Penso che la gente pensasse che non potessi farlo perché il completamento del codice AS / IDEA non suggerisce android:enabledquando inizi a digitarlo. (Ancora oggi.)
Kevin Krumwiede il

1
Ho provato che non funziona, solo dal codice setEnabledfunziona
FindOutIslamNow

23

In Java, una volta ottenuto il riferimento del pulsante:

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

Per abilitare / disabilitare il pulsante, è possibile utilizzare:

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

O:

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

Poiché si desidera disabilitare il pulsante dall'inizio, è possibile utilizzare button.setEnabled (false); nel metodo onCreate. Altrimenti, da XML, puoi usare direttamente:

android:clickable = "false"

Così:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />

ha risposto 8 dic '10 alle 7:08 Varun

1
@Poldie: In realtà, se leggi le due risposte capirai che sono abbastanza simili ma non uguali.
Paolo Rovelli,

9

Nel mio caso,

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

sta funzionando bene e sta abilitando e disabilitando il pulsante come dovrebbe. Ma una volta che lo stato del pulsante viene disabilitato, non torna più allo stato abilitato, sebbene sia selezionabile. Ho provato a invalidare e aggiornare lo stato disegnabile, ma senza fortuna.

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

Se tu o qualcuno che ha un problema simile, ciò che funziona per me è impostare nuovamente lo sfondo disegnabile. Funziona su qualsiasi livello API.

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

8

In Kotlin, se si fa riferimento alla vista pulsanti con id, abilitare / disabilitare il pulsante come simile

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

2

prima in xml crea il pulsante come android:clickable="false"

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

quindi nel tuo codice, all'interno del oncreate()metodo imposta la proprietà button come

btn.setClickable(true);

quindi all'interno del pulsante fai clic su cambia il codice in

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

MODO ERRATO IN ASCOLTO PER UTILIZZARE IL VARIABILE ALL'INTERNO DEL PARAMETRO !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

IL MODO CORRETTO:

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: in risposta a @ jeroen-bollen

 View.OnClickListener 

è la definizione di interfaccia per un richiamo da richiamare quando si fa clic su una vista.

con la definizione del metodo

void onClick(View v);

quando si fa clic sulla vista, l'oggetto della classe View effettua il callback al metodo onClick () inviandolo come parametro stesso, quindi il parametro null view non dovrebbe verificarsi se si tratta di un errore di asserzione , potrebbe accadere ad esempio quando View class object è stata distrutta nel frattempo (per esempio raccolto da GC) o il metodo è stato manomesso a causa di hack

poco su instanceof & null

JLS / 15.20.2. Tipo di confronto Operatore instanceof

In fase di esecuzione, il risultato dell'operatore instanceof è vero se il valore di RelationalExpression non è nullo e il riferimento può essere trasmesso a ReferenceType senza generare ClassCastException.

Altrimenti il ​​risultato è falso .


tre parole dell'autore

SE U CHIEDI PERCHÉ?

MAGGIORMENTE DA EVITARE NullPointerException

Un po 'più di codice ti farà risparmiare tempo nel successivo rilevamento dei bug nel tuo codice e riduce il verificarsi di abnomie.

considerare il seguente esempio:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

2
Sembra che ogni volta che viene chiamata l'espressione else, il codice è già intercettato. Ti aspettavi un pulsante ma qualcos'altro è stato superato. voi dovrebbe un'eccezione quando vnon è una Button.
Jeroen,

Non proprio quello che volevo dire, ma comunque un miglioramento.
Jeroen,

@JeroenBollen eelaborate per favore :) ok vedo solo una cosa non coerente è il messaggio di eccezione su "errata vista passata al metodo". A parte questo è solo un tentativo di mostrare come dovrebbe apparire.
ceph3us,

Volevo dire che quando la funzione stessa riceve null, è già un bug e dovrebbe generare un'eccezione.
Jeroen,

1

Con Kotlin puoi fare,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.