setEnabled () vs setClickable (), was ist der Unterschied?

78

Bis jetzt, als ich den Benutzer daran hindern wollte, die Taste zu drücken, stellte ich die ein button.setClickable(false);und änderte normalerweise den Text in eine graue Farbe (um den Benutzer wissen zu lassen, dass die Taste deaktiviert ist). Heute bin ich auf das setEnabled()Grundstück gestoßen .

Also ging ich zur Dokumentation, um die Erklärung der Methode unten zu sehen:

setEnabled(boolean enabled)
   Set the enabled state of this view.

Was bedeutet das überhaupt? Was ist der Unterschied zwischen Aktivierungsstatus / anklickbarem Status und deaktiviertem Status / nicht anklickbarem Status? Könnte jemand bitte erklären, was der Unterschied zwischen dem, was ich zuvor getan habe, der Verwendung der anklickbaren Eigenschaft und der Verwendung der setEnabled()Eigenschaft ist? Was soll wann verwendet werden? Ich habe nach Stapelüberlauf gesucht, konnte aber nichts Ähnliches finden.

Emil Adz
quelle
5
Ich würde vermuten, dass setEnabled (false) eine Ansicht nicht anklickbar UND nicht fokussierbar macht, was bedeutet, dass sie vollständig gesperrt wird. Außerdem ist setEnabled (false) im Falle eines Buttons ein bevorzugter Weg, da der Button dadurch visuell "deaktiviert" wird
Droidman
Was meinst du mit: "... da es den Button visuell" deaktiviert "macht? Wie ändert es ihn visuell? Und was ist, wenn ich einen benutzerdefinierten Selektor verwende?
Emil Adz
Ich bin mir nicht sicher über einen benutzerdefinierten Selektor und habe ihn nicht getestet. Aber im Falle eines Standardknopfes wird er halbtransparent, so dass Sie es nicht von Hand tun müssen
Droidman

Antworten:

79

Was zum Teufel soll das heißen?

Zitieren der Wikipedia-Seite für "GUI-Widget" :

Im Kontext einer Anwendung kann ein Widget zu einem bestimmten Zeitpunkt aktiviert oder deaktiviert werden. Ein aktiviertes Widget kann auf Ereignisse wie Tastenanschläge oder Mausaktionen reagieren. Ein Widget, das auf solche Ereignisse nicht reagieren kann, wird als deaktiviert betrachtet. Das Erscheinungsbild eines deaktivierten Widgets unterscheidet sich normalerweise von einem aktivierten Widget. Das deaktivierte Widget kann in einer helleren Farbe gezeichnet oder auf irgendeine Weise visuell verdeckt sein. Ein Beispiel finden Sie im Bild rechts.

Dieses Konzept gibt es seit einigen Jahrzehnten und ist in den meisten GUI-Frameworks zu finden.

Was ist der Unterschied zwischen Aktivierungsstatus / anklickbarem Status und deaktiviertem Status / nicht anklickbarem Status?

In Android reagiert ein Widget, auf das nicht geklickt werden kann, nicht auf Klickereignisse. Ein deaktiviertes Widget kann nicht nur nicht angeklickt werden, sondern zeigt auch visuell an, dass es deaktiviert ist.

Was meinst du mit: "... da der Button dadurch visuell" deaktiviert "wird? Wie ändert er ihn visuell?

Was ein ButtonAussehen und eine Antwort wie ein macht, Buttonist sein Hintergrund, der ein ist StateListDrawable. Für den deaktivierten Status wird ein bestimmtes Bild verwendet.

CommonsWare
quelle
@ Maver1ck: Der Status ist Button StateListDrawabledefinitiv deaktiviert: github.com/android/platform_frameworks_base/blob/master/core/… Es ist möglich, dass die ButtonKlasse andere Effekte anwendet , obwohl mir keine bekannt sind.
CommonsWare
Ich habe gerade einen kleinen Test gemacht und es scheint, dass für Buttons auch die Textfarbe geändert wird. Es wird grau, wenn ich die Schaltfläche auf false gesetzt habe.
FD_
Also im Grunde, wenn ich einen benutzerdefinierten Selektor verwende? Ich sollte ein bestimmtes Drawable angeben, wenn ich die setEnable () -Methode für diese bestimmte Schaltfläche verwenden möchte (und ein Feedback zu dieser Änderung erhalten möchte).
Emil Adz
@FD_: Ah, ja, das ist TextViewdeaktiviertes Verhalten, das Buttonerbt. Textfarben sind häufig ColorStateListObjekte, die auch aktivierte oder deaktivierte Zustände haben können. Entschuldigung, das habe ich vergessen.
CommonsWare
2
@EmilAdz: Wenn Sie die Textfarbe oder den Hintergrund der Schaltfläche ändern, möchten Sie einen entsprechenden Eintrag im ColorStateListoder StateListDrawablefür einen deaktivierten Status haben. Dieser Eintrag wird verwendet, wenn er setEnabled(false)aufgerufen wird oder android:enabled="false"in einem Layout verwendet wird.
CommonsWare
6

Grundsätzlich reagiert eine aktivierte falsche Antwort nicht auf eine Antwort und eine anklickbare falsche Antwort, wenn sie zur Laufzeit festgelegt ist, und vertraue mir, dass ich es gerade versucht habe.

Dilip Poudel
quelle
2

Wie Dilip sagte, funktioniert setClickable nicht, wenn es zur Laufzeit festgelegt wird. Hier ist ein Trick, damit es funktioniert:

ToggleButton toggle = ...
toggle.setOnTouchListener(new ToggleButton.OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
     // If true is returned, the event is eated by the TouchListener
     return !v.isClickable();
  }
});
Thibault Cuvillie
quelle
2

Ein großer Unterschied, den ich an keiner anderen Stelle sehe, besteht in überlappenden Ansichten. In einer Ansicht mit clickable = true und enabled = false können Sie keine Ansicht dahinter drücken. Mit einer Ansicht mit clickable = false können Sie jedoch eine Ansicht dahinter drücken.

Trevor
quelle
1

Ansichten können auch auf externe Tastaturen, Steuerkreuze (Fernbedienungs- / Gaming-Controller) und Hilfsgeräte ( Schalter , Bildschirmleser ) reagieren .

Renato
quelle
0

Die Unterschiede sind oben aufgeführt, aber es gibt einen Tipp. Verwenden Sie setClickable () nach setOnClickListener (). Deswegen:

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}
Aloys_ 寒风
quelle
0

setClickable public void setClickable (boolescher Klick)

Es aktiviert oder deaktiviert Klickereignisse für die bestimmte Ansicht. Wenn eine Ansicht anklickbar ist, ändert sich ihr Status bei jedem Klick in "gedrückt". Wenn diese Eigenschaft der Ansicht deaktiviert ist, ändert sie ihren Status nicht.

setEnabled public void setEnabled (Boolescher Wert aktiviert)

Es setzt den Aktivierungsstatus dieser Ansicht. Wenn die bestimmte Ansicht aktiviert sein soll, übergeben Sie true im Parameter, andernfalls übergeben Sie false

Muhammad Abdullah
quelle