it-swarm.com.de

Wie deaktiviere ich eine Schaltfläche Android?

Ich habe ein Layout erstellt, das zwei Schaltflächen enthält, "Weiter" und "Zurück". Zwischen den Schaltflächen werden einige dynamische Ansichten generiert. 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 keine weiteren Ansichten angezeigt werden sollen. Gibt es überhaupt eine Möglichkeit, die Tasten zu deaktivieren?

screen shot of sample layout

340
Dijo David

Hast du das probiert?

myButton.setEnabled(false); 

Update: Danke an Gwen. Fast vergessen, dass Android:clickable in Ihrem XML-Layout festgelegt werden kann, um zu bestimmen, ob eine Schaltfläche anklickbar ist oder nicht.

743
Varun

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 Android:clickable angeklickt werden kann.

47
Gwen

Sie schreiben in Ihrer Aktivität nur eine einzige Codezeile

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

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

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

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); in der onCreate-Methode verwenden. 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" />
24
Paolo Rovelli

Ja, es kann in XML deaktiviert werden, indem man einfach Folgendes verwendet:

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

In meinem Fall,

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

funktioniert einwandfrei und es aktiviert und deaktiviert die Schaltfläche, wie es sollte. Sobald der Schaltflächenstatus deaktiviert ist, wird er jedoch nie wieder in den aktivierten Status versetzt, obwohl er anklickbar ist. Ich habe versucht, den Zeichenstatus ungültig zu machen und zu aktualisieren, aber kein Glück.

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

Wenn Sie oder eine andere Person ein ähnliches Problem haben, kann ich den Hintergrund wieder zeichnen. Funktioniert auf jeder API-Ebene.

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

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

FALSCHE WEISE IM LISTENER VARIABLE ANSTELLE VON PARAMETER VERWENDEN !!!

btnSend.setOnClickListener(new OnClickListener() {

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

    }
});

RICHTIG:

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 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 sendet. Daher sollte kein Null-Ansichtsparameter auftreten, wenn dies ein Assertionsfehler ist. Dies kann beispielsweise beim Anzeigen eines Objekts der Fall sein Die Klasse wurde in der Zwischenzeit zerstört (zum Beispiel durch GC gesammelt) oder die Methode wurde aufgrund von Hack manipuliert

wenig über instanceof & null

JLS/15.20.2. Typ Vergleichsoperator instanceof

Zur Laufzeit hat der Operator instanceof den Wert true, wenn der Wert von RelationalExpression nicht null ist und der Verweis in ReferenceType umgewandelt werden kann, ohne eine ClassCastException auszulösen.

Andernfalls ist das Ergebnis falsch.


drei Worte des Autors

WENN SIE FRAGEN, WARUM?

AM MEISTEN ZU VERMEIDEN NullPointerException

Etwas mehr Code spart Zeit bei der späteren Fehlerbehebung in Ihrem Code und reduziert das Auftreten von Abnormalitäten.

Betrachten Sie folgendes Beispiel:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
2
ceph3us

erst in xml mach den button als Android:clickable="false"

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

setzen Sie dann in Ihrem Code in der Methode oncreate() die Eigenschaft button auf

btn.setClickable(true);

ändern Sie dann innerhalb der Schaltfläche den Code 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
rajeesh