Chciałbym wdrożyć przycisk przełącznika android.widget.Switch (dostępny z API v.14).
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Switch" />
Ale nie jestem pewien, jak dodać detektor zdarzeń dla przycisku. Czy powinien to być odbiornik „onClick”? A skąd mam wiedzieć, czy jest włączony, czy nie?
Odpowiedzi:
Przełącz
CompoundButton
atrybuty dziedziczy , więc poleciłbym OnCheckedChangeListenerźródło
OnCLick
, przełączniki nie mająOnChange
! Dobrze zaprojektowany zespół Google!Użyj następującego fragmentu kodu, aby dodać Switch do swojego układu poprzez XML:
Następnie w metodzie onCreate działania uzyskaj odwołanie do przełącznika i ustaw jego OnCheckedChangeListener:
źródło
Dla tych, którzy używają Kotlin, możesz ustawić detektor dla przełącznika (w tym przypadku posiadającego identyfikator
mySwitch
) w następujący sposób:isChecked
ma wartość true, jeśli przełącznik jest obecnie zaznaczony (ON), a false w przeciwnym razie.źródło
Zdefiniuj swój układ XML:
Następnie utwórz działanie
======== Dla poniżej API 14 użyj SwitchCompat =========
XML
Czynność
źródło
Układ widgetu Switch jest mniej więcej taki.
W klasie Activity możesz kodować na dwa sposoby. Zależy od sposobu, w jaki możesz kodować.
Pierwszy sposób
Drugi sposób
źródło
Możesz użyć DataBinding i ViewModel dla zdarzenia Change Checked Check
źródło
są dwa sposoby
za pomocą widoku XML onclick Dodaj przełącznik w XML, jak poniżej:
W klasie YourActivity (na przykład MainActivity.java)
Dodaj Switch w XML, jak poniżej:
W klasie YourActivity (na przykład MainActivity.java)
źródło
Moje rozwiązanie, używając a
SwitchCompat
i Kotlin. W mojej sytuacji musiałem zareagować na zmianę tylko wtedy, gdy użytkownik wywołał ją za pomocą interfejsu użytkownika. W rzeczywistości, mój przełącznik reaguje naLiveData
, i to zarówno wykonanesetOnClickListener
isetOnCheckedChangeListener
bezużyteczny.setOnClickListener
w rzeczywistości prawidłowo reaguje na interakcję użytkownika, ale nie jest uruchamiany, jeśli użytkownik przeciągnie kciukiem po przełączniku.setOnCheckedChangeListener
na drugim końcu jest wyzwalany także wtedy, gdy przełącznik jest programowo przełączany (na przykład przez obserwatora). Teraz w moim przypadku przełącznik był obecny na dwóch fragmentach, a więc onRestoreInstanceState w niektórych przypadkach wyzwalałby przełącznik ze starą wartością zastępującą poprawną wartość.Więc spojrzałem na kod SwitchCompat i byłem w stanie naśladować jego zachowanie, rozróżniając kliknięcie i przeciągnięcie, i użyłem go do zbudowania niestandardowego listera dotykowego, który działa tak, jak powinien. No to ruszamy:
Jak tego użyć:
rzeczywisty detektor dotyku, który akceptuje lambda z kodem do wykonania:
Dla kompletności tak wyglądał obserwator stanu
switchstate
(jeśli go masz):źródło
W Kotlinie:
źródło