Android – Masquer tous les messages Toast affichés

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

Dans mon application, il existe une liste, lorsqu’un utilisateur clique sur un élément, un message de toast est affiché, 10 éléments – 10 messages de toast.

Donc, 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.

Ça ne devrait pas être comme ça 🙂

Ma solution consistait à initialiser un seul Toast dans l’activité. Puis 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(); } 

Comment puis-je désactiver tous les messages de toast en cours de traitement?

Vous pouvez annuler des Toasts individuels en appelant cancel() sur l’object Toast . Cependant, vous ne pouvez pas annuler tous les Toasts .

Qu’en est-il de 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(); } } 

La solution de Mudar a fonctionné à merveille pour moi sur un problème similaire – j’avais plusieurs toasts dans un backlog après plusieurs clics de button .

Une instance de Toast avec différents setText()s et show() s était exactement la réponse que je cherchais – le message précédent était annulé dès qu’un nouveau bouton était cliqué. Spot sur

Juste pour référence, voici ce que j’ai fait …

Dans OnCreate :

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

Dans chaque OnClick :

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

Ma solution est de sauvegarder toutes les références toast dans une liste et de créer une méthode pour les annuler toutes en cas de besoin:

 private ArrayList msjsToast = new ArrayList(); private void killAllToast(){ for(Toast t:msjsToast){ if(t!=null) { t.cancel(); } } msjsToast.clear(); } 

Lorsque vous créez un Toast, procédez comme suit et enregistrez la référence:

 Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG); t.show(); msjsToast.addToast(t); 

Lorsque vous devez les supprimer:

 killAllToast(); 

Vous pouvez créer cela comme une méthode statique dans une classe globale et l’utiliser pour tuer tous les toasts de l’application.

Je pense avoir trouvé un moyen de faire en sorte que le message toasts ne fasse pas la queue pour moi. Je pensais 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 hack que tout. Mais je montre un message de toast chaque fois que quelqu’un préfère une partie de mon application. Et s’ils deviennent fous en cliquant sur le bouton Favoris, ils deviendront fous avec les messages de toasts. Mais plus maintenant. Il attendra 2 secondes, puis définira mon object toast sur null et lui permettra de réafficher.

Voici ma réponse simple au problème:

Tout d’abord, créez un object Toast global.

  private Toast example; 

Maintenant, chaque fois que vous souhaitez appeler un nouveau message Toast, procédez comme suit:

 if(buttonClicked) { example.cancel(); example = Toast.makeText(this, "" , Toast.LENGTH_SHORT); example.setText("Button Clicked"); example.show(); } 

Cela garde tous les toasts dans un Toast central et supprime le spam Toast. C’est une solution rapide, alors peut-être y a-t-il une manière plus élégante de le faire.

C’est comme ça que je le fais.

 Toast toast; if(toast==null) toast=Toast.makeText(getApplicationContext(),R.ssortingng.act_now_private_post_text,Toast.LENGTH_LONG); else toast.setText(R.ssortingng.act_now_private_post_text); toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10); toast.show(); 
 mToast=Toast.makeText(this, "", Toast.LENGTH_LONG); showToast.setOnClickListener(new OnClickListener() { public void onClick(View v) { mToast.cancel(); Ssortingng text=null; if(ON) { text="Toast is on"; } else { text="Toast is off"; } mToast.setText(text); mToast.setDuration(Toast.LENGTH_SHORT); mToast.show(); } }); 

Vous pouvez utiliser comme ça ..

 class MyToast { private static Toast t; public MyToast(Context ctx, Ssortingng message) { if (t != null) { t.cancel(); t = null; } t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT); } public void show() { t.show(); } } 

En utilisant l’excellente réponse de Madur ci-dessus, j’ai étendu cela à une classe qui traiterait différents types de messages:

 public class ToastManager { private Toast toastWarningMessage; private Toast toastAddMessage; ... public void messageWarning(Context context, Ssortingng message) { if(toastWarningMessage == null) { toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT); } else { toastWarningMessage.cancel(); toastWarningMessage.setText(message); } toastWarningMessage.show(); } public void messageAdd(Context context, Ssortingng message) { if(toastAddMessage == null) { toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT); } else { toastAddMessage.cancel(); toastAddMessage.setText(message); } toastAddMessage.show(); } ... } 

Et cela s’appelle de l’intérieur de mon activité principale:

 ToastManager toastManager; ... private void toastWarningMessage(Ssortingng message) { if(toastManager == null) toastManager = new ToastManager(); toastManager.messageWarning(this, message); } 

La raison de la classification des messages est de s’assurer qu’aucun message important n’est écrasé. Cette solution semble facile à réutiliser car elle implique uniquement de renommer les toasts et les noms des fonctions.

Lorsque l’utilisateur claque le bouton, le toast annule simplement chaque fois le même type de message. Le seul problème est que l’utilisateur puisse spammer un mélange de messages. Cela conduit au premier message qui se répète et une fois qu’il expire, les autres messages s’affichent une fois chacun. Pas vraiment un gros problème, mais quelque chose à savoir.

Je n’ai pas examiné les inconvénients possibles d’avoir plusieurs instances de Toast.

Dans mon application, les toasts en queue apparaissaient encore et encore lorsque l’application était en arrière-plan, alors j’ai suivi pour résoudre le problème.

Ajouter du code pour détecter quand l’application entre en arrière-plan. Une façon d’enregistrer le gestionnaire de cycle de vie. Pour plus de détail ref

 registerActivityLifecycleCallbacks(new MyLifecycleHandler()); 

App.inBackground = true; quand l’application va en arrière-plan et affiche le toast en utilisant la classe SmartToast

 public class SmartToast { static ArrayList> toasts = new ArrayList<>(); public static void showToast(@NonNull Context context,@NonNull String message){ //this will not allowed to show toast when app in background if(App.inBackground) return; Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT); toasts.add(new WeakReference<>(toast)); toast.show(); //clean up WeakReference objects itself ArrayList> nullToasts = new ArrayList<>(); for (WeakReference weakToast : toasts) { if(weakToast.get() == null) nullToasts.add(weakToast); } toasts.remove(nullToasts); } public static void cancelAll(){ for (WeakReference weakToast : toasts) { if(weakToast.get() != null) weakToast.get().cancel(); } toasts.clear(); } } 

appelez SmartToast.cancelAll(); méthode lorsque l’application va en arrière-plan pour masquer les toasts en cours et tous en attente. Le code est amusant. Prendre plaisir!

Créez un object Toast en dehors de la fonction onClick et utilisez le code ci-dessous. Il arrête tout Toast existant et lance le dernier Toast.

 Toast mToast; public void onClick(Ssortingng abc) { if(mToast!=null) mToast.cancel(); Context context = this; mToast = Toast.makeText(context, abc, Toast.LENGTH_SHORT); mToast.show(); } 

Que penses-tu de ceux-ci !?

 private Toast toast; ... // Methods for short toast messages and long toast messages private void showShortToast(Ssortingng message) { if(null != toast) toast.cancel(); (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT)).show(); } private void showLongToast(Ssortingng message) { if(null != toast) toast.cancel(); (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG)).show(); } 

et à onPause ()

 @Override protected void onPause() { ... if(null != toast) toast.cancel(); .. } 

Voici comment désactiver les messages de toast, supprimer l’expression show() .

 //Disable notification message Toast.makeText(this,"Message",Toast.LENGTH_SHORT); //Enable notification message Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();