Ich möchte eine Schaltfläche implementieren, android.widget.Switch (verfügbar ab API v.14).
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Switch" />
Ich bin mir jedoch nicht sicher, wie ich einen Ereignis-Listener für die Schaltfläche hinzufügen soll. Sollte es ein "onClick" -Hörer sein? Und wie würde ich wissen, ob es "eingeschaltet" ist oder nicht?
Antworten:
Switch erbt
CompoundButton
die Attribute, daher würde ich den OnCheckedChangeListener empfehlenquelle
OnCLick
, Schalter haben nichtOnChange
! Gut gestaltetes Google-Team!Verwenden Sie das folgende Snippet, um Ihrem Layout über XML einen Switch hinzuzufügen:
Rufen Sie dann in der onCreate-Methode Ihrer Aktivität einen Verweis auf Ihren Switch ab und legen Sie dessen OnCheckedChangeListener fest:
quelle
Für Benutzer von Kotlin können Sie einen Listener für einen Switch (in diesem Fall mit der ID
mySwitch
) wie folgt festlegen :isChecked
ist wahr, wenn der Schalter gerade aktiviert ist (EIN), andernfalls falsch.quelle
Definieren Sie Ihr XML-Layout:
Erstellen Sie dann eine Aktivität
======== Für unten stehende API 14 verwenden Sie SwitchCompat =========
XML
Aktivität
quelle
Das Layout für das Switch-Widget ist ungefähr so.
In der Aktivitätsklasse können Sie auf zwei Arten codieren. Hängt von der Verwendung ab, die Sie codieren können.
Erster Weg
Zweiter Weg
quelle
Sie können DataBinding und ViewModel für das Ereignis Switch Checked Change verwenden
quelle
Meine Lösung mit a
SwitchCompat
und Kotlin. In meiner Situation musste ich nur dann auf eine Änderung reagieren, wenn der Benutzer sie über die Benutzeroberfläche auslöste. In der Tat, mein Schalter reagiert auf einLiveData
, und dies sowohl gemachtsetOnClickListener
undsetOnCheckedChangeListener
unbrauchbar.setOnClickListener
Tatsächlich reagiert es korrekt auf Benutzerinteraktionen, wird jedoch nicht ausgelöst, wenn der Benutzer den Daumen über den Switch zieht.setOnCheckedChangeListener
am anderen Ende wird auch ausgelöst, wenn der Schalter programmgesteuert umgeschaltet wird (z. B. von einem Beobachter). In meinem Fall war der Schalter auf zwei Fragmenten vorhanden, und so löste onRestoreInstanceState in einigen Fällen den Schalter mit einem alten Wert aus, der den korrekten Wert überschrieb.Also habe ich mir den Code von SwitchCompat angesehen und konnte sein Verhalten bei der Unterscheidung von Klicken und Ziehen erfolgreich nachahmen und daraus einen benutzerdefinierten Touchlistener erstellen, der ordnungsgemäß funktioniert. Auf geht's:
Wie man es benutzt:
Der eigentliche Touch-Listener, der ein Lambda mit dem auszuführenden Code akzeptiert:
Der Vollständigkeit halber sah der Beobachter des Staates
switchstate
(falls vorhanden) folgendermaßen aus:quelle
Es gibt zwei Möglichkeiten:
Verwenden der XML-Onclick-Ansicht Add Switch in XML wie folgt:
In Ihrer Aktivitätsklasse (z. B. MainActivity.java)
Fügen Sie Switch in XML wie folgt hinzu:
In Ihrer Aktivitätsklasse (z. B. MainActivity.java)
quelle
In Kotlin:
quelle