Comment empêcher l'activité de chargement deux fois en appuyant sur le bouton
Je suis en train d'essayer d'empêcher l'activité de chargement deux fois si j'appuie sur le bouton deux fois de suite après le premier clic.
J'ai une activité qui charge sur le clic d'un bouton, dire
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//Load another activity
}
});
Maintenant, parce que l'activité de chargement a appels réseau, il faut un peu de temps à charger (MVC). Je montre un chargement de vue pour cela, mais si j'appuie sur le bouton deux fois avant que je puisse voir l'activité de chargé à deux reprises.
Faire un sais comment faire pour éviter cela?
- Vous pouvez désactiver le bouton après l'ouverture de l'activité...et lorsque l'activité de la finition, de,de le ré-activer...u peut détecter l'arrivée de la deuxième activité en appelant onActivityResult fonction
- Désactiver le bouton lorsqu'il est cliqué en premier et la réactiver plus tard seulement, lorsque vous souhaitez que le bouton sera cliqué de nouveau.
- la désactivation ne fonctionne pas de manière simple, si la déclaration suivante est pour certains processus ou de début de l'activité... Pour désactiver le bouton, vous devez avoir à créer un thread séparé...
- Si frapper de la même API deux fois reportez-vous ici: techstricks.com/avoid-multiple-requests-when-using-volley
- Double Possible de bouton Éviter de multiples rapide clics
Vous devez vous connecter pour publier un commentaire.
Dans le bouton de l'écouteur d'événement, désactiver le bouton et de montrer une autre activité.
Remplacer
onResume()
ré-activer le bouton.Ajouter à votre
Activity
définition dansAndroidManifest.xml
...android:launchMode = "singleTop"
, qui réalise l'effet sans casser Android multitâche. La documentation indique que la plupart des applications ne devraient pas utiliser lesingleInstance
option.Vous pouvez utiliser l'intention des drapeaux comme cela.
Il fera seulement une activité ouverte au sommet de l'histoire de la pile.
android:launchMode = "singleTop"
, de cette façon, il est résolu sans avoir à ajouter de l'indicateur pour chaque Intention.Depuis DONC je ne m'autorise pas à commenter sur d'autres réponses, j'ai de polluer ce fil avec une nouvelle réponse.
Commun des réponses pour l'activité "s'ouvre deux fois" problème et mes expériences avec ces solutions (Android 7.1.1):
EDIT: C'était pour le démarrage des activités avec startActivity(). Lors de l'utilisation de startActivityForResult() j'ai besoin de régler à la fois FLAG_ACTIVITY_SINGLE_TOP et FLAG_ACTIVITY_CLEAR_TOP.
Disons @wannik est juste, mais si nous avons plus de 1 bouton d'appel, une même action, l'écouteur, et j'ai cliquer sur deux boutons à la fois presque en même temps avant de partir de la prochaine activité...
Ainsi il est bon si vous avez le champ
private boolean mIsClicked = false;
et dans l'écouteur:Et
onResume()
nous avons besoin de revenir à l'état:Quelle est la deifference entre mon et @wannik de réponse?
Si vous définissez enabled à false dans le port d'écoute de l'appel de la vue d'un autre bouton en utilisant le même port d'écoute sera toujours activé. Donc, pour être sûr que l'auditeur action n'est pas appelé deux fois, vous avez besoin d'avoir quelque chose de global qui désactive tous les appels de l'auditeur(tant pis si c'est une nouvelle instance ou pas)
Quelle est la différence entre ma réponse et les autres?
Ils sont la pensée dans le droit chemin, mais ils ne sont pas la pensée de l'avenir de retour à la même instance de l'appel d'activité 🙂
synchronized(mIsClicked) {...}
ainsi être sûr à 100%.private
dire que je suis entièrement responsable de cela, mais je ne voudrais pas aveuglément dire à quelqu'un de faire de même, surtout si la question est sur quelque chose de cette base.Utilisation instance unique pour éviter activité d'invoquer deux fois.
Je pense que vous allez résoudre le problème à l'envers. Il est généralement une mauvaise idée pour une activité à faire long l'exécution de requêtes web dans une de son de démarrage du cycle de vie des méthodes (
onCreate()
,onResume()
, etc). Vraiment ces méthodes devraient tout simplement être utilisé pour instancier et initialiser les objets de votre activité et devront donc être relativement rapide.Si vous devez effectuer une demande web, puis le faire dans un thread d'arrière-plan de votre nouvellement lancé l'activité (et de leur montrer le dialogue de chargement de la nouvelle activité). Une fois le fond de la demande thread se termine, il peut mettre à jour l'activité et de masquer la boîte de dialogue.
Ensuite, cela signifie que votre nouvelle activité devrait être lancé immédiatement et éviter le "double clic" d'être possible.
Espère que cela aide:
C'était seulement pour moi quand
startActivity(intent)
D'autres très très solution la plus simple si vous ne voulez utiliser
onActivityResult()
est de désactiver le bouton pendant 2 secondes (ou le temps que vous voulez), n'est pas l'idéal, mais il peut résoudre en partie le problème est que certains cas, le code est simple:Pour cette situation, je vais passer pour l'un des deux s'approcha,
singleTask
dans manifest.xml OU un indicateur de l'Activité duonResume()
&onDestroy()
méthodes respectivement.Pour la première solution: je préfère utiliser
singleTask
de l'activité dans le manifeste plutôt quesingleInstance
, comme parsingleInstance
, j'ai compris qu'en certaines occasions, l'activité, la création d'une nouvelle instance distincte pour elle-même, qui suite à deux demandes distinctes de la fenêtre dans les applications en cours d'exécution dans bcakground et en plus de la mémoire supplémentaire allocations qui seraient le résultat d'une très mauvaise Expérience de l'Utilisateur lorsque l'utilisateur ouvre les applications en vue de choisir une application pour reprendre.Donc, le mieux est d'avoir de l'activité définie à l'manifest.xml comme suit:
vous pouvez vérifier l'activité de lancement modes ici.
Pour la deuxième solution, vous avez juste à définir une variable statique ou une préférence variable, par exemple:
et de l'autre côté quand vous voulez pour le lancement de cette activité, il suffit de cocher:
Simplement de maintenir un drapeau bouton onClick méthode:
public boolean oneTimeLoadActivity = false;
Si vous utilisez onActivityResult, vous pouvez utiliser une variable pour économiser de l'état.
Fonctionne sur le bouton de retour trop pressé, car la demande de code est renvoyé sur l'événement.
Utiliser un
flag
variable ilto true
,Vérifier si c'est vrai juste
return
d'autre effectuer une Activité d'Appel.Vous pouvez également utiliser setClickable(false) l'une de l'exécution de l'Activité de l'Appel
perform click; wait; flg = false;
pour quand nous serons de retourVous pouvez simplement remplacer startActivityForResult et utiliser la variable d'instance:
//variable pour suivre l'événement en temps
2.Dans le onClick vérifier que si le temps actuel et la dernière sur la différence de temps sont moins que je de deuxième puis de ne rien faire(retour)
sinon, pour l'événement click
Vous pouvez l'essayer aussi