Jaki jest najlepszy sposób zapobiegania podwójnemu kliknięciu przycisku w systemie Android?
android
android-button
double-click
Androider
źródło
źródło
Odpowiedzi:
Wyłącz przycisk za pomocą,
setEnabled(false)
dopóki użytkownik nie będzie mógł go ponownie kliknąć.źródło
zapisanie czasu ostatniego kliknięcia zapobiegnie temu problemowi.
to znaczy
źródło
Moje rozwiązanie to
Użycie jest podobne do OnClickListener, ale zamiast tego zastąp onSingleClick ():
źródło
Wyłączenie przycisku lub ustawienie niemożności kliknięcia nie wystarczy, jeśli wykonujesz intensywną obliczeniowo pracę w onClick (), ponieważ zdarzenia kliknięcia mogą zostać umieszczone w kolejce przed wyłączeniem przycisku. Napisałem abstrakcyjną klasę bazową, która implementuje OnClickListener, którą możesz zastąpić, która rozwiązuje ten problem, ignorując wszelkie kliknięcia w kolejce:
Użycie jest takie samo jak OnClickListener, ale zamiast tego zastąp OnOneClick ():
źródło
Możesz to zrobić w bardzo fantazyjny sposób za pomocą funkcji rozszerzenia Kotlin i RxBinding
lub
a potem tylko:
źródło
Ja też mam podobny problem, wyświetlałem jakiś datepicker i timepickers, gdzie czasami klikałem 2 razy. Rozwiązałem to przez to
Możesz zmienić czas w zależności od wymagań. Ta metoda działa dla mnie.
źródło
setEnabled(false)
u mnie działa idealnie.Chodzi o to, że piszę
{ setEnabled(true); }
na początku i robię tofalse
za pierwszym kliknięciem przycisku.źródło
Wiem, że to stare pytanie, ale dzielę się najlepszym rozwiązaniem, jakie znalazłem, aby rozwiązać ten powszechny problem
I w innym pliku, takim jak Utils.java
źródło
Rzeczywistym rozwiązaniem tego problemu jest użycie setEnabled (false), które wyszarzają przycisk i setClickable (false), co sprawia, że nie można odebrać drugiego kliknięcia. Przetestowałem to i wydaje się być bardzo skuteczne.
źródło
Jeśli ktoś nadal szuka krótkiej odpowiedzi, możesz skorzystać z poniższego kodu
Ten kod zostanie wprowadzony do środka za
if statement
każdym razem, gdy użytkownik kliknie na przycisk,View within 1 second
a następniereturn;
zostanie zainicjowany i dalszy kod nie zostanie zainicjowany.źródło
K leanest Kotlin idiomatyczne sposób:
Stosowanie:
źródło
Moje rozwiązanie to próba użycia
boolean
zmiennej:I używając jak poniżej:
AKTUALIZACJA : rozwiązanie Kotlin, używając rozszerzenia widoku
źródło
Click Guard działa dobrze z Butter Knife
źródło
w mojej sytuacji korzystałem z widoku przycisków i zbyt szybko przejmował on kliknięcia. po prostu wyłącz klikalne i włącz je ponownie po kilku sekundach ...
Zasadniczo stworzyłem klasę opakowującą, która otacza Twoje widoki onClickListener. Jeśli chcesz, możesz również ustawić niestandardowe opóźnienie.
a żeby to nazwać, po prostu zrób to:
lub podaj własne opóźnienie:
AKTUALIZACJA: Powyżej trochę staromodny teraz, gdy RxJava jest tak powszechna. jak wspominali inni, w Androidzie możemy użyć przepustnicy, aby spowolnić kliknięcia. oto jeden przykład:
możesz użyć do tego tej biblioteki:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
źródło
źródło
Możesz użyć tej metody. Korzystając z post delay, możesz zająć się zdarzeniami podwójnego kliknięcia.
void debounceEffectForClick (widok widoku) {
źródło
Rozszerzenie Kotlin, które pozwala na zwięzły kod wbudowany i zmienne czasy oczekiwania na podwójne kliknięcie
Stosowanie:
Lub
źródło
Poniższy kod uniemożliwi użytkownikowi wielokrotne kliknięcie w ułamku sekundy i zezwoli dopiero po 3 sekundach.
źródło
Wygląda na to, że ustawienie słuchaczy kliknięć w onResume i wyłączenie ich w onPause też działa.
źródło
U mnie pomogło tylko zapamiętanie znacznika czasu i sprawdzenie go (że od poprzedniego kliknięcia minęło więcej niż 1 sekunda).
źródło
Mam nadzieję, że to Ci pomoże, umieść kod w programie obsługi zdarzeń.
// ------------------------------------------------ --------------------------------
źródło
Nie znalazłem żadnej z tych sugestii, jeśli metoda onClick nie powraca natychmiast. Zdarzenie touch jest umieszczane w kolejce przez Androida, a następne onClick jest wywoływane dopiero po zakończeniu pierwszego. (Ponieważ jest to wykonywane w jednym wątku interfejsu użytkownika, jest to naprawdę normalne.) Musiałem użyć czasu, w którym funkcja onClick jest zakończona + jedną zmienną logiczną, aby zaznaczyć, czy dany onClick działa. Oba te atrybuty znacznika są statyczne, aby uniknąć jednoczesnego działania onClickListener. (Jeśli użytkownik kliknie inny przycisk) Możesz po prostu zamienić swój OnClickListener na tę klasę i zamiast implementować metodę onClick, musisz zaimplementować abstrakcyjną metodę oneClick ().
źródło
możesz również użyć powiązań rx autorstwa Jake Wharton, aby to osiągnąć. oto próbka, która dzieli 2 sekundy między kolejnymi kliknięciami:
// uwaga: zignoruj Object v w tym przypadku i myślę, że zawsze.
źródło
źródło
Dodając do odpowiedzi Jima kod można uczynić bardziej zwięzłym:
Stosowanie:
źródło
W Kotlin
źródło
Ustawienie opcji Klikalny na fałsz nie działa przy pierwszym dwukrotnym kliknięciu, ale kolejne podwójne kliknięcia są blokowane. To tak, jakby delegat kliknięcia ładowania za pierwszym razem był wolniejszy, a drugie kliknięcie było przechwytywane przed zakończeniem pierwszego.
źródło
Naprawiam ten problem za pomocą dwóch klas, jednej podobnej do odpowiedzi @ jinshiyi11, a druga opiera się na jawnym kliknięciu, w tym przypadku możesz kliknąć przycisk tylko raz, jeśli chcesz kolejne kliknięcie, musisz to wyraźnie wskazać .
Przykład użycia:
źródło
źródło
AtomicBoolean
nie może naprawdę pomóc.Spróbuj tego, to działa:
źródło