12
votes

Comment prévenir le double code exécuté en cliquant deux fois rapidement sur un bouton de Android

Si je clique vite à mon bouton de mon application Android, il semble que le code derrière elle fonctionne deux fois. Si je clique sur mon bouton de menu deux fois, l'activité qui doit être lancée onclick vient de commencer deux fois et je dois le quitter deux fois.

Ceci est vraiment ennuyeux car si je clique trop vite pour les boutons de menu, je peux charger un tas entier d'activités à l'arrière-plan et je dois les arrêter un par un, donc c'est clairement un état de buggy de mon application que je veux résoudre ce problème.

Que puis-je faire avec ce problème? < p> J'utilise simple onclicklisteners et boutons

edit:

Concern ce sur les réponses et les commentaires Mes boutons de menu ressemblent à ceci: xxx

Après toute cette correction, c'est toujours le même: s Lorsque je clique sur une personne fou, plusieurs activations sont sur la pile d'historique et je dois quitter plusieurs fois.

Toute suggestion? Qu'est-ce que je fais mal?


2 commentaires

Essayez de désactiver le bouton CLIQUE. Donc, quand il vous sera cliqué en premier, il deviendra désactivé et ne capturera aucun chiffre futur, je suppose.


Vous avez toujours plusieurs activités sur la pile, même avec un sommet unique? Consultez ma réponse mise à jour ...


8 Réponses :


8
votes

Vous pouvez utiliser le code suivant: btn.setéenabled (false); xxx


2 commentaires

Mais il conviendra ensuite de plus en plus en cliquant sur d'autres, puis comment activez-vous à nouveau?


@Miguel: Dans l'exemple ci-dessus, le code écrit dans OnClickListener, démarre une activité, alors lorsque l'utilisateur revient à l'activité précédente, elle sera automatiquement activée. Mais dans d'autres cas, comme si une tâche ASYNC est démarrée dans OnClickListener, alors onpostexecute () serait le meilleur endroit où vous permettriez à nouveau le bouton.



2
votes

Eh bien, c'est le comportement attendu ...

Lancez votre nouvelle avidité avec un drapeau unique_top

ou essayez de paramétrer Android: LaunkMode = "SingleInstance" pour l'activité TOP20 dans votre AndroidManifest.xml


2 commentaires

Si j'ajoute cette affirmation, une animation étrange apparaît sur la modification de l'activité: la mise en page se déplace à gauche d'un écran vide apparaît alors ma nouvelle activité est affichée. Pour une raison quelconque, ce paramètre ignore toutes mes animations d'activité qui sont actuellement: Remplacement de la bande de remplacement (0, 0); Si vous pouvez me dire comment désactiver cette animation d'écran vide, je peux sélectionner votre réponse comme réponse à mon problème car je n'ai maintenant pas d'activités dupliquées. =)


Essayez d'ajouter un drapeau no_animation lorsque l'activité de lancement :)



2
votes

Ceci résout la question de plusieurs instances d'activité et joue toujours l'animation par défaut

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


0 commentaires

5
votes

Vous pouvez désactiver la vue temporairement comme celle-ci xxx pré>


edit: stry> p>

La solution ci-dessus fonctionnera bien. Mais il deviendra encore mieux lorsque vous utilisez la puissance de Kotlin P>

1) Créer l'écoute de SafeCLIKC P>

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}


1 commentaires

J'ai utilisé une variation de ce qui précède pour résoudre un problème similaire. Réponse efficace et efficace sans la complexité des autres approches.



0
votes

Cette solution convient mieux à mes besoins. Au lieu d'utiliser Activer / Désactiver la fonction de vue. J'utilise le temps, d'abord, créez une variable pour stocker l'utilisateur de la dernière fois enfoncé la vue * Puis lorsque l'utilisateur appuie sur la vue, capturez l'heure dans une variable afin de comparer le moment actuel et l'utilisateur de la dernière fois enfoncé la vue, Si la durée différentielle entre les temps est trop petite, ce qui signifie que c'est rapide ou extrêmement rapide l'ignorer et que c'est tout. Mais si c'est un temps raisonnable pour vous, définissez la dernière variable de la dernière fois avec l'heure actuelle et faites tout ce que vous voulez faire.

@Override
public void onListItemClick(ListView list, View item, int position, long id) {

    Long now = System.currentTimeMillis();
    if((now - lastTimeSelected) > 500){
        lastTimeSelected = now;
        // your code goes here
    } else {
        Log.i(TAG, "Too fast!");
    }

}


0 commentaires

0
votes

Ajoutez l'extrait de code suivant à votre définition d'activité dans AndroidManifest.xml

android:launchMode = "singleTask"


0 commentaires

0
votes

Utilisez gelgé variable intérieure application classe.

c'est xxx

quelque part en cliquant: xxx

quelque part à libérer, par exemple, lorsque la nouvelle activité a été lancée xxx

in androidmanifest.xml : xxx


0 commentaires

4
votes
 Button.setOnClickListener(new View.OnClickListener {  
   @Override
   public void onClick(final View v) {
        v.setEnabled(false);
        v.postDelayed(new Runnable() {
         @Override
         public void run() {
            v.setEnabled(true);
         }
        },150); //150 is in milliseconds
    }
 });  

1 commentaires

Cela devrait être accepté comme la réponse