Was ist der beste Weg, um Doppelklicks auf eine Schaltfläche in Android zu verhindern?
android
android-button
double-click
Androider
quelle
quelle
Antworten:
Deaktivieren Sie die Schaltfläche mit,
setEnabled(false)
bis der Benutzer sicher darauf klicken kann.quelle
Das Speichern einer letzten Klickzeit beim Klicken verhindert dieses Problem.
dh
quelle
Meine Lösung ist
Die Verwendung ähnelt der von OnClickListener, überschreibt jedoch stattdessen onSingleClick ():
quelle
Das Deaktivieren der Schaltfläche oder das Deaktivieren der Option "Nicht anklickbar" reicht nicht aus, wenn Sie in onClick () rechenintensiv arbeiten, da Klickereignisse in die Warteschlange gestellt werden können, bevor die Schaltfläche deaktiviert werden kann. Ich habe eine abstrakte Basisklasse geschrieben, die OnClickListener implementiert, die Sie stattdessen überschreiben können. Sie behebt dieses Problem, indem Sie alle in der Warteschlange befindlichen Klicks ignorieren:
Die Verwendung ist mit OnClickListener identisch, überschreibt jedoch stattdessen OnOneClick ():
quelle
Mit Kotlin Extension Functions und RxBinding können Sie dies auf sehr ausgefallene Weise tun
oder
und dann einfach:
quelle
Ich habe auch ein ähnliches Problem. Ich habe einige Datums- und Zeitmesser angezeigt, bei denen es manchmal zweimal zu einem Klick kam. Ich habe es dadurch gelöst
Sie können die Zeit je nach Ihren Anforderungen ändern. Diese Methode funktioniert bei mir.
quelle
setEnabled(false)
funktioniert perfekt für mich.Die Idee ist, ich schreibe
{ setEnabled(true); }
am Anfang und mache es einfachfalse
beim ersten Klick auf die Schaltfläche.quelle
Ich weiß, dass es eine alte Frage ist, aber ich teile die beste Lösung, die ich gefunden habe, um dieses häufige Problem zu lösen
Und in einer anderen Datei wie Utils.java
quelle
Die eigentliche Lösung für dieses Problem besteht darin, setEnabled (false) zu verwenden, mit dem die Schaltfläche ausgegraut wird, und setClickable (false), mit dem der zweite Klick nicht empfangen werden kann. Ich habe dies getestet und es scheint sehr effektiv zu sein.
quelle
Wenn jemand noch nach einer kurzen Antwort sucht, können Sie den folgenden Code verwenden
Dieser Code wird in das
if statement
Verzeichnis eingefügt, wenn der Benutzer auf das klickt,View within 1 second
und dannreturn;
wird der Code initiiert und der weitere Code wird nicht initiiert.quelle
Der K LEANEST Kotlin idiomatische Weg:
Verwendung:
quelle
Meine Lösung besteht darin, eine
boolean
Variable zu verwenden:Und wie folgt verwenden:
UPDATE : Kotlin-Lösung mit Ansichtserweiterung
quelle
Click Guard funktioniert gut mit Butter Knife
quelle
In meiner Situation habe ich eine Schaltflächenansicht verwendet und die Klicks wurden zu schnell ausgeführt. Deaktivieren Sie einfach das anklickbare und aktivieren Sie es nach einigen Sekunden wieder ...
Grundsätzlich habe ich eine Wrapper-Klasse erstellt, die Ihre Views onClickListener umschließt. Sie können auch eine benutzerdefinierte Verzögerung festlegen, wenn Sie möchten.
und um es zu nennen, machen Sie einfach Folgendes:
oder geben Sie Ihre eigene Verzögerung an:
UPDATE: Oben ein bisschen altmodisch, jetzt wo RxJava so weit verbreitet ist. Wie andere bereits erwähnt haben, könnten wir in Android einen Gashebel verwenden, um die Klicks zu verlangsamen. Hier ist ein Beispiel:
Sie können diese Bibliothek dafür verwenden:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
quelle
quelle
Sie können diese Methode verwenden. Durch die Verwendung der Nachverzögerung können Sie auf Doppelklickereignisse achten.
void debounceEffectForClick (Ansichtsansicht) {
quelle
Kotlin-Erweiterung, die präzise Inline-Code- und variable Doppelklick-Wartezeiten ermöglicht
Verwendung:
Oder
quelle
Der folgende Code verhindert, dass der Benutzer innerhalb von Sekundenbruchteilen mehrmals klickt, und lässt ihn erst nach 3 Sekunden zu.
quelle
Es scheint, dass das Setzen Ihrer Klick-Listener in onResume und das Nullstellen in onPause ebenfalls den Trick macht.
quelle
Für mich hat es nur geholfen, mich an den Zeitstempel zu erinnern und ihn zu überprüfen (der seit dem letzten Klick mehr als 1 Sekunde vergangen ist).
quelle
Ich hoffe, dies kann Ihnen helfen, den Code in Ihren Event-Handler zu setzen.
// ------------------------------------------------ --------------------------------
quelle
Ich habe festgestellt, dass keiner dieser Vorschläge funktioniert, wenn die onClick-Methode nicht sofort zurückgegeben wird. Das Touch-Ereignis wird von Android in die Warteschlange gestellt und der nächste onClick wird erst aufgerufen, nachdem der erste abgeschlossen ist. (Da dies auf einem UI-Thread durchgeführt wird, ist dies wirklich normal.) Ich musste die Zeit verwenden, zu der die onClick-Funktion beendet ist + eine boolesche Variable, um zu markieren, ob der angegebene onClick ausgeführt wird. Diese beiden Markerattribute sind statisch, um zu vermeiden, dass onClickListener gleichzeitig ausgeführt wird. (Wenn der Benutzer auf eine andere Schaltfläche klickt) Sie können Ihren OnClickListener einfach durch diese Klasse ersetzen. Anstatt die onClick-Methode zu implementieren, müssen Sie die abstrakte oneClick () -Methode implementieren.
quelle
Sie können auch RX-Bindungen von Jake Wharton verwenden , um dies zu erreichen. Hier ist ein Beispiel, das 2 Sekunden zwischen aufeinanderfolgenden Klicks auffüllt:
// Anmerkung: ignoriere das Objekt v in diesem Fall und ich denke immer.
quelle
quelle
Durch Hinzufügen zu Jims Antwort kann der Code präziser gestaltet werden:
Verwendung:
quelle
In Kotlin
quelle
Das Setzen von Clickable auf false funktioniert nicht beim ersten Doppelklick, aber nachfolgende Doppelklicks werden blockiert. Es ist, als ob der Ladeklick-Delegat beim ersten Mal langsamer ist und der zweite Klick erfasst wird, bevor der erste abgeschlossen ist.
quelle
Ich behebe dieses Problem mit zwei Klassen, eine ähnlich der Antwort von @ jinshiyi11, und der Anoter basiert auf einem expliziten Klick. In diesem Fall können Sie nur einmal auf eine Schaltfläche klicken. Wenn Sie einen weiteren Klick wünschen, müssen Sie ihn explizit angeben .
Anwendungsbeispiel:
quelle
quelle
AtomicBoolean
nicht wirklich helfen kann.Versuchen Sie dies, es funktioniert:
quelle