Si je clique plusieurs fois sur un bouton en peu de temps, parfois l'action est exécutée plusieurs fois (dépend de la vitesse du clic), y a-t-il un moyen d'empêcher cela en utilisant tout ce qui est intégré dans ButterKnife code >?
Après avoir cherché sur Google une solution à ce problème, je suis tombé sur un message SO demandant le même https: // stackoverflow. com / a / 38525054/7575454 après cela, j'ai essayé de creuser un peu sur le code source de ButterKnife
et j'ai trouvé la classe nommée DebouncingOnClickListener
(Surtout regardé sur cette classe car la classe «layout» était similaire à une solution que j'ai trouvée sur StackOverflow).
Il y a un commentaire sur cette classe qui dit
Un clic sur un bouton désactive tous les boutons de ce cadre
Si je comprends bien, cela signifie que je ne devrais pas pouvoir "envoyer de spam" en cliquant sur mon bouton. Mais ce n'est pas le cas car je suis capable d'exécuter le bouton d'action plusieurs fois si je clique sur ledit bouton pour spam.
La solution que j'ai trouvée sur StackOverflow "corrige" mon problème mais je me demandais juste s'il y avait autre chose de similaire sur ButterKnife (Appart pour la classe que j'ai dit plus tôt) car je ne veux pas vraiment faire de désordre sur mon code source, définissez les écouteurs de clic "manuellement" pour quelques boutons et utilisez @OnClick
sur ceux qui ne me préoccupent pas vraiment s'ils sont appelés plusieurs fois.
3 Réponses :
J'utilise la solution que vous avez jointe. J'économise sur une variable le temps où un bouton est cliqué et je m'assure que ce temps est égal ou supérieur à 250 ms. Cela fonctionne bien mais je suis d'accord que ce serait bien d'avoir ButterKnife contrôler cela définissant automatiquement le laps de temps que vous voulez entre les clics. Cette option est également utile car non seulement assurez-vous qu'un bouton n'est pas cliqué plusieurs fois, mais vous pouvez utiliser la même variable pour chaque bouton de la même activité.
Une autre option serait de désactiver le bouton sur lequel vous avez cliqué et de le réactiver une fois l'action déclenchée par ce bouton terminée.
Le DebouncingOnClickListener
empêche plusieurs clics dans un cadre. Ce n'est pas un long délai, seulement quelques millisecondes. Comme vous pouvez le lire en commentaire d'un problème , Jake Wharton (l'auteur) considère ce comportement dans le cadre de la couche d'application, qu'il ne souhaite pas ajouter à Butter Knife .
Il ne rebondit que deux clics sur une image. Si vous cliquez deux fois sur deux cadres séparés, c'est la responsabilité de la couche d'application à gérer. Vous pouvez résoudre ce problème en désactivant le bouton au premier clic.
Ou votre application ou domaine implémente un anti-rebond basé sur le temps (en fonction de votre cas d'utilisation).
Ajoutez la classe suivante à votre projet et reconstruisez votre projet, le problème sera résolu.
package butterknife.internal; import android.support.annotation.NonNull; import android.view.View; public abstract class DebouncingOnClickListener implements View.OnClickListener { static boolean enabled = true; public final String name = "MyDebouncingOnClickListener"; private static final Runnable ENABLE_AGAIN = new Runnable() { @Override public void run() { enabled = true; } }; @Override public final void onClick(View v) { if (enabled) { enabled = false; // v.post(ENABLE_AGAIN); !!!The modified code is here!!!! v.postDelayed(ENABLE_AGAIN, 300); doClick(v); } } public abstract void doClick(View v); @NonNull @Override public String toString() { return super.toString(); } }