1
votes

Comment éviter de répéter des actions en double-cliquant sur le bouton?

Voici mes actions dans onClick (). Le problème est que si j'appuie deux fois sur le bouton, la nouvelle activité sera ouverte deux fois. J'ai essayé d'utiliser setEnabled () et setClickable (), mais cela ne fonctionne pas. Il affiche encore plus d'une activité

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), 
CalendarActivity.class);
            intent.putExtra("day", 16);
            intent.putExtra("month", 12);
            intent.putExtra("year", 1996);
            startActivityForResult(intent, CALENDAR_ACTIVITY_CODE);
        }
    });


0 commentaires

3 Réponses :


3
votes

Essayez de désactiver le bouton cliquable après la première fois qu'il a été cliqué:

android:launchMode = "singleTop"

Si cela ne vous aide pas, vous pouvez accéder à votre activité dans le manifeste et ajouter ceci :

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //add this line
    button.setClickable(false);
        Intent intent = new Intent(getActivity(), CalendarActivity.class);
        intent.putExtra("day", 16);
        intent.putExtra("month", 12);
        intent.putExtra("year", 1996);
        startActivityForResult(intent, CALENDAR_ACTIVITY_CODE);
    }
});


6 commentaires

Cela fonctionnera tant que les clics sont suffisamment lents pour que le premier clic soit traité avant le deuxième clic (car alors le bouton ne sera pas cliquable). Mais il est toujours possible d'appuyer assez rapidement pour mettre en file d'attente deux événements de clic avant que le premier ne soit traité, et cela ne couvrira pas ce cas. Bien sûr, cette solution pourrait encore être suffisante pour les besoins d'OP.


Je viens de regarder votre réponse ci-dessous (très intéressante) et je veux juste demander, cela peut arriver même avec la configuration "singleTop" dans le manifeste? J'étais sûr qu'avec ceci écrit à l'intérieur du manifeste, cela couvrait en quelque sorte ce problème et empêchait l'activité de se rouvrir


singleTop change ce qui se passe lorsque vous appelez startActivity [ForResult] () , mais ne change pas si oui ou non votre l'écouteur de clic est déclenché plusieurs fois. Cependant, singleTop signifie que même si votre écouteur de clics est déclenché (disons) trois fois, une seule instance de l'activité sera démarrée (puis deux nouvelles intentions seront livrées au de cette activité. méthode onNewIntent () ).


C'est pourquoi j'adore le débordement de pile - chaque jour est une nouvelle chance d'apprendre quelque chose de nouveau, qui était vraiment utile.


Il rouvre même avec Android: launchMode = "singleTop"


Regardez la réponse ci-dessus - Ben p l'explique très bien



2
votes

Il s'agit en fait d'un problème étonnamment complexe. La racine du problème est que les événements de l'interface utilisateur (par exemple, un clic sur un bouton) entraînent la «publication» des messages à la fin d'une file d'attente de messages. Si vous êtes assez rapide, il est possible de publier plusieurs de ces messages dans la file d'attente des messages avant que le premier ne soit traité.

Cela signifie que même la désactivation du bouton dans votre méthode onClick () ne résoudra pas vraiment le problème (puisque la désactivation ne "se produira" pas avant que le premier message ne soit traité, mais vous pourriez déjà avoir trois autres messages en double en attente dans la file d'attente des messages).

La meilleure chose à faire est de suivre une sorte de drapeau booléen et vérifier le drapeau à chaque fois à l'intérieur de onClick():

button.setOnClickListener(v -> {
    if (firstClick) {
        firstClick = false;
        // do your stuff
    }
});
private boolean firstClick = true;

Vous devez vous rappeler de réinitialiser firstClick sur true chaque fois que vous souhaitez réactiver les pressions sur les boutons, bien sûr.


0 commentaires

0
votes

Pour résoudre ce problème, vous pouvez utiliser Jake Wharton Bibliothèque Rxbinding qui vous permet de convertir vos événements de clic en flux.

Vous pouvez ajouter un événement de limitation qui aide à arrêter l'événement à partir de l'heure spécifiée

RxView.clicks(button).throttleFirst(2, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread()).
                        subscribe(new Consumer<Object>() {
                            @Override
                            public void accept(Object o) {
                                Toast.makeText(getApplicationContext(), "Avoid multiple clicks using throttleFirst", Toast.LENGTH_SHORT).show();
                            }
                        });


1 commentaires

Regardez la réponse de Ben P. - c'est super simple et facile à comprendre