56 votes

Android - Masquer tous les messages Toast affichés

Comment supprimer tous les messages de toast actuellement affichés ?

Dans mon application, il y a une liste, quand un utilisateur clique sur un élément, un message de toast est affiché, 10 éléments - 10 messages de toast.

Ainsi, si l'utilisateur clique 10 fois, puis appuie sur le bouton de menu, il doit attendre quelques secondes avant de pouvoir lire le texte de l'option de menu.

Cela ne devrait pas être comme ça :)

0 votes

Une autre option : stackoverflow.com/a/16103514

82voto

Mudar Points 1236

Ma solution était d'initialiser un seul Toast dans l'activité. Puis de changer son texte à chaque clic.

Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
  mToast.setText("This is a");
  mToast.show();
} else if (b) {
  mToast.setText("This is b");
  mToast.show();
}

2 votes

Merci pour votre réponse, CommonsWare ci-dessus a déjà expliqué comment désactiver une liste de messages de toast en attente... :) merci, mais désolé... je pense que vous avez mal compris la question !

2 votes

Bien que ce soit une bonne réponse, il ne s'agit pas réellement du même comportement. Avec cette solution, vous ne pourrez jamais avoir deux toasts qui s'affichent l'un après l'autre.

32voto

CommonsWare Points 402670

comment désactiver tous les messages de toast en cours de traitement ?

Vous pouvez annuler des Toasts en appelant cancel() sur le Toast objet. A ma connaissance, il n'y a aucun moyen pour vous d'annuler tous les objets en suspens. Toasts mais

0 votes

Hmm, merci beaucoup, je vais essayer de créer quelque chose. mais si j'ajoute tous les toast messages à une sorte de structure... y a-t-il une possibilité de vérifier lesquels ont été affichés et lesquels non. Je suis un peu occupé en ce moment... désolé de demander et de ne pas essayer, au moins je répondrai en essayant de construire quelque chose (au plus tard) à la fin de la semaine. -Merci !

8 votes

C'est ma dernière bête noire d'Android : l'impossibilité d'annuler tous les toasts en attente.

3 votes

Quelle déception : si vous annulez le toast en cours, les toasts suivants ne s'afficheront qu'après le temps que ce toast était sur le point de s'afficher.

13voto

Justin Muller Points 919

Pourquoi ne pas vérifier si un toast est déjà affiché ?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}

0 votes

C'est ce qui a le mieux fonctionné pour moi, car j'avais une paire de curseurs qui pouvaient chacun générer plusieurs Toasts par seconde lorsque l'utilisateur jouait avec eux. Upvoting et merci pour votre contribution.

8voto

La solution de Mudar a très bien fonctionné pour moi sur un problème similaire - j'avais plusieurs toasts qui s'empilaient dans un arriéré après de multiples button clics.

Une instance de Toast avec différents setText()s y show() était exactement la réponse que je cherchais - le message précédent est annulé dès qu'un nouveau bouton est cliqué. Bien vu

Juste pour référence, voici ce que j'ai fait...

Sur OnCreate :

    final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);

Dans chaque OnClick :

myToast.setText(R.string.toast1);
myToast.show();

1 votes

Je déclasse ce commentaire simplement parce que je pense qu'il n'apporte rien de nouveau. Il aurait pu être un commentaire à la réponse de Mudar à la place.

3voto

S.A.Jay Points 323

Je pense avoir trouvé un moyen pour que le message des toasts ne fasse pas la queue pour moi. J'ai pensé que je pourrais partager.

cette partie va en haut.

private Toast msg;    

Cette partie va dans mon setOnTouchListener()

if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
msg.show();

//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
      public void run()
      {
          msg = null;

      }
}, 2000);

}

C'est plus un piratage qu'autre chose. Mais je montre un message de toast chaque fois que quelqu'un favorise une partie de mon application. Et s'ils deviennent fous en cliquant sur le bouton favori, les messages de toast deviennent fous. Mais plus maintenant. Il va attendre 2 secondes et ensuite mettre mon objet toast à null et lui permettre de s'afficher à nouveau.

1 votes

Votre solution Handler.postDelayed est intéressante, +1 pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X