Quelle est la meilleure façon d'éviter les doubles clics sur un bouton sous Android?
android
android-button
double-click
Androider
la source
la source
Réponses:
Désactivez le bouton avec
setEnabled(false)
jusqu'à ce que l'utilisateur puisse le cliquer à nouveau en toute sécurité.la source
l'enregistrement d'un dernier clic lors d'un clic évitera ce problème.
c'est à dire
la source
Ma solution est
L'utilisation est similaire à OnClickListener mais remplace onSingleClick () à la place:
la source
La désactivation du bouton ou la définition d'un clic ne suffit pas si vous effectuez un travail intensif en calcul dans onClick () car les événements de clic peuvent être mis en file d'attente avant que le bouton ne puisse être désactivé. J'ai écrit une classe de base abstraite qui implémente OnClickListener que vous pouvez remplacer à la place, qui résout ce problème en ignorant tous les clics en file d'attente:
L'utilisation est la même que OnClickListener mais remplace OnOneClick () à la place:
la source
Vous pouvez le faire de manière très sophistiquée avec les fonctions d'extension Kotlin et RxBinding
ou
et puis juste:
la source
J'ai également rencontré un problème similaire, j'affichais des sélecteurs de date et des sélecteurs de temps où parfois il y avait un clic 2 fois. Je l'ai résolu par ceci
Vous pouvez changer l'heure en fonction de vos besoins. Cette méthode fonctionne pour moi.
la source
setEnabled(false)
fonctionne parfaitement pour moi.L'idée est que j'écris
{ setEnabled(true); }
au début et que je le fais justefalse
au premier clic du bouton.la source
Je sais que c'est une vieille question, mais je partage la meilleure solution que j'ai trouvée pour résoudre ce problème commun
Et dans un autre fichier, comme Utils.java
la source
La solution réelle à ce problème est d'utiliser setEnabled (false) qui grise le bouton et setClickable (false) qui fait en sorte que le deuxième clic ne puisse pas être reçu.J'ai testé cela et cela semble très efficace.
la source
Si quelqu'un cherche toujours une réponse courte, vous pouvez utiliser le code ci-dessous
Ce code entrera dans le
if statement
chaque fois que l'utilisateur clique sur leView within 1 second
, puis lereturn;
sera lancé et le code supplémentaire ne sera pas lancé.la source
La manière idiomatique de K LEANEST Kotlin :
Usage:
la source
Ma solution est d'essayer d'utiliser une
boolean
variable:Et en utilisant comme ci-dessous:
MISE À JOUR : solution Kotlin, utilisant l'extension de vue
la source
Click Guard fonctionne bien avec le couteau à beurre
la source
dans ma situation, j'utilisais une vue de bouton et cela prenait les clics trop rapidement. désactivez simplement le cliquable et réactivez-le après quelques secondes ...
Fondamentalement, j'ai créé une classe wrapper qui entoure vos vues onClickListener. vous pouvez également définir un délai personnalisé si vous le souhaitez.
et pour l'appeler, faites simplement ceci:
ou indiquez votre propre délai:
MISE À JOUR: ci-dessus, un peu à l'ancienne maintenant que RxJava est si répandu. comme d'autres l'ont mentionné, dans Android, nous pourrions utiliser un accélérateur pour ralentir les clics. voici un exemple:
vous pouvez utiliser cette bibliothèque pour cela:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
la source
la source
Vous pouvez utiliser cette méthode. En utilisant le délai de publication, vous pouvez prendre en charge les événements de double clic.
void debounceEffectForClick (vue vue) {
la source
Extension Kotlin qui permet un code en ligne concis et des temps d'attente variables en double clic
Usage:
Ou
la source
Le code ci-dessous empêchera l'utilisateur de cliquer plusieurs fois en quelques fractions de secondes et ne l'autorisera qu'après 3 secondes.
la source
Il semble que la configuration de vos écouteurs de clic dans onResume et leur annulation dans onPause fasse également l'affaire.
la source
Pour moi, je me souviens seulement de l'horodatage et de sa vérification (plus d'une seconde s'est écoulée depuis le clic précédent) a aidé.
la source
J'espère que cela peut vous aider, mettez le code dans votre gestionnaire d'événements.
// ------------------------------------------------ --------------------------------
la source
J'ai trouvé qu'aucune de ces suggestions ne fonctionne si la méthode onClick ne revient pas immédiatement. L'événement tactile est mis en file d'attente par Android et le prochain onClick n'est appelé qu'une fois le premier terminé. (Comme cela est fait sur le seul thread d'interface utilisateur, c'est vraiment normal.) J'avais besoin d'utiliser le moment où la fonction onClick est terminée + une variable booléenne pour marquer si le onClick donné est en cours d'exécution. Ces deux attributs de marqueur sont statiques pour éviter que onClickListener ne s'exécute en même temps. (Si l'utilisateur clique sur un autre bouton) Vous pouvez simplement remplacer votre OnClickListener par cette classe et au lieu d'implémenter la méthode onClick, vous devez implémenter la méthode abstraite oneClick ().
la source
vous pouvez également utiliser les liaisons rx de jake wharton pour ce faire. voici un échantillon qui se tamponne 2 secondes entre les clics successifs:
// note: ignorez l'objet v dans ce cas et je pense toujours.
la source
la source
En ajoutant à la réponse de Jim, le code peut être rendu plus concis:
Usage:
la source
À Kotlin
la source
Définir Clickable sur false ne fonctionne pas lors du premier double-clic, mais les doubles-clics suivants sont bloqués. C'est comme si le délégué de clic de chargement la première fois était plus lent et que le second clic était capturé avant la fin du premier.
la source
Je corrige ce problème en utilisant deux classes, une similaire à la réponse @ jinshiyi11 et la réponse est basée sur un clic explicite, en cela vous ne pouvez cliquer qu'une fois sur un bouton, si vous voulez un autre clic, vous devez l'indiquer explicitement .
Exemple d'utilisation:
la source
la source
AtomicBoolean
ne peut pas vraiment aider.Essayez ceci, cela fonctionne:
la source