Wie deaktiviere ich eine Android-Schaltfläche?

371

Ich habe ein Layout erstellt, das zwei Schaltflächen enthält: Weiter und Zurück. Zwischen den Schaltflächen generiere ich einige dynamische Ansichten. Wenn ich die Anwendung zum ersten Mal starte, möchte ich die Schaltfläche "Zurück" deaktivieren, da keine vorherigen Ansichten vorhanden sind. Ich möchte auch die Schaltfläche "Weiter" deaktivieren, wenn nicht mehr Ansichten angezeigt werden sollen. Gibt es überhaupt eine Möglichkeit, die Tasten zu deaktivieren?

Screenshot des Beispiellayouts

Dijo David
quelle

Antworten:

801

Hast du das versucht?

myButton.setEnabled(false); 

Update: Danke an Gwen. Fast vergessen, dass android:clickablein Ihrem XML-Layout festgelegt werden kann, ob eine Schaltfläche anklickbar ist oder nicht.

Varun
quelle
66
Das Äquivalent ist Android: aktiviert in XML.
Namratha
1
Und wo haben Sie das in der Dokumentation gefunden? Kannst du es hier verlinken?
Varun
4
@Namratha es funktioniert nur für "Button" Widgets, nicht für imageView als Button
mehmet
Xamarin-Äquivalent: myButton.Enabled = false;
Cameron Forward
48

Sie können es in Ihrem XML nicht aktivieren oder deaktivieren (da Ihr Layout zur Laufzeit festgelegt ist), aber Sie können festlegen, ob es beim Start der Aktivität mit anklickbar ist android:clickable.

Gwen
quelle
4
5 Jahre Erfahrung in Android und ich erfahre JETZT davon! : /
Sagar
35

Sie schreiben einfach eine einzelne Codezeile in Ihre Aktivität

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

Wenn Sie dieselbe Schaltfläche aktivieren möchten, schreiben Sie einfach

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
quelle
20
Das sind 2 Zeilen. Dies ist einer. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark
34
Versuchen Sie, die Gefühle zu verstehen Matt ..;)
Deepak Sharma
30

Ja, es kann in XML deaktiviert werden, indem nur Folgendes verwendet wird:

<Button
android:enabled="false"
/>
Mulaffer
quelle
2
Dies ist die wahre Antwort für XML. All dieser Unsinn, mit klickbar zu spielen, hat nichts damit zu tun, wie die Schaltfläche gezeichnet wird, damit sie deaktiviert aussieht.
Scott Biggs
1
Ich denke, die Leute dachten, Sie können dies nicht tun, da die Vervollständigung des AS / IDEA-Codes nicht vorschlägt, android:enabledwann Sie mit der Eingabe beginnen. (
Bis
1
Ich habe versucht, es funktioniert nicht, nur von Code setEnabledfunktioniert
FindOutIslamNow
23

In Java, sobald Sie die Referenz der Schaltfläche haben:

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

Zum Aktivieren / Deaktivieren der Schaltfläche können Sie Folgendes verwenden:

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

Oder:

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

Da Sie die Schaltfläche von Anfang an deaktivieren möchten, können Sie button.setEnabled (false) verwenden. in der onCreate-Methode. Andernfalls können Sie in XML direkt Folgendes verwenden:

android:clickable = "false"

Damit:

<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
quelle
beantwortet 8. Dezember 10 um 7:08 Varun
1
@Poldie: Wenn Sie die beiden Antworten lesen, werden Sie verstehen, dass sie ziemlich ähnlich, aber nicht gleich sind.
Paolo Rovelli
9

In meinem Fall,

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

funktioniert einwandfrei und aktiviert und deaktiviert die Schaltfläche wie gewünscht. Sobald der Schaltflächenstatus deaktiviert ist, kehrt er nie wieder in den aktivierten Status zurück, obwohl er anklickbar ist. Ich habe versucht, den Zeichenzustand ungültig zu machen und zu aktualisieren, aber kein Glück.

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

Wenn Sie oder jemand, der ein ähnliches Problem hat, funktioniert es für mich, den Hintergrund wieder zeichnbar zu machen. Funktioniert auf jeder API-Ebene.

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

Wenn Sie in Kotlin auf die Schaltflächenansicht mit der ID verweisen, aktivieren / deaktivieren Sie die Schaltfläche wie folgt

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
quelle
2

Zuerst in XML machen Sie die Schaltfläche als android:clickable="false"

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

oncreate()Setzen Sie dann in Ihrem Code innerhalb der Methode die Schaltfläche-Eigenschaft auf

btn.setClickable(true);

Klicken Sie dann innerhalb der Schaltfläche auf, um den Code in zu ändern

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
quelle
2

FALSCHER WEG IM HÖRER, VARIABLE STATT PARAMETER ZU VERWENDEN !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

RICHTIGER WEG:

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: Als Antwort auf @ jeroen-bollen

 View.OnClickListener 

ist die Schnittstellendefinition für einen Rückruf, der aufgerufen wird, wenn auf eine Ansicht geklickt wird.

mit Methodendefinition

void onClick(View v);

Wenn auf die Ansicht geklickt wird, ruft das View-Klassenobjekt die Methode onClick () zurück, die als Parameter selbst gesendet wird. Daher sollte kein Nullansichtsparameter auftreten, wenn es sich um einen Assertionsfehler handelt kann beispielsweise der Fall sein, wenn die View-Objektklasse in der Zwischenzeit zerstört wurde (z Beispiel durch GC gesammelt) oder Methode wurde aufgrund von Hack manipuliert

wenig über Instanz von & null

JLS / 15.20.2. Typvergleich Operator-Instanz von

Zur Laufzeit ist das Ergebnis des Operators instanceof true, wenn der Wert von RelationalExpression nicht null ist und die Referenz in den ReferenceType umgewandelt werden kann, ohne eine ClassCastException auszulösen.

Andernfalls ist das Ergebnis falsch .


drei Wörter vom Autor

WENN SIE FRAGEN, WARUM?

Meistens, um NullPointerException zu vermeiden

Etwas mehr Code spart Zeit bei der späteren Fehlerverfolgung in Ihrem Code und reduziert das Auftreten von Anomalien.

Betrachten Sie folgendes Beispiel:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
quelle
2
Es scheint, als ob der Code jedes Mal, wenn der else-Ausdruck aufgerufen wird, bereits fehlerhaft ist. Sie haben einen Button erwartet, aber etwas anderes wurde übergeben. Sie sollten eine Ausnahme auslösen, wenn dies vnicht der Fall ist Button.
Jeroen
Nicht ganz das, was ich meinte, aber dennoch eine Verbesserung.
Jeroen
@JeroenBollen eelaborate bitte :) ok ich sehe nur eine Sache nicht konsistent es ist Ausnahmemeldung über "falsche Ansicht an Methode übergeben". Außerdem ist es nur ein Versuch zu zeigen, wie es aussehen sollte.
Ceph3us
Ich meinte, wenn die Funktion selbst null empfängt, ist dies bereits ein Fehler und sie sollte eine Ausnahme auslösen.
Jeroen
1

Mit Kotlin können Sie tun,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Alles ist gut
quelle