Android – 隐藏所有显示的Toast消息

如何删除当前显示的所有Toast消息?

在我的应用程序中,有一个列表,当用户点击一个项目时,显示一个Toast消息,10个项目 – 10个Toast消息。

所以如果用户点击10次,然后按下菜单button,他们必须等待几秒钟,直到他们能够阅读菜单选项文本。

它不应该是这样:)

我的解决scheme是在活动中初始化一个Toast。 然后在每次点击时更改文字。

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(); } 

如何禁用正在处理的所有Toast消息?

您可以通过在Toast对象上调用cancel()来取消各个Toasts 。 AFAIK,但你没有办法取消所有未完成的Toasts

如何检查是否已经显示吐司?

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

Mudar的解决scheme在我遇到类似的问题时效果很好 – 点击多次button后,我的各种吐司堆积如山。

一个带有不同setText()sshow()的Toast实例就是我正在寻找的答案 – 只要点击一个新button,就会取消之前的消息。 发现

仅供参考,以下是我所做的…

OnCreate

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

在每个OnClick

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

我想我find了一种方法来让敬酒信息不排队等候我。 以为我会分享。

这部分顶部。

 private Toast msg; 

这部分在我的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); } 

这比任何事情都更糟糕。 但是,只要有人收到我的应用程序的一部分,我就会显示敬酒信息。 如果他们疯狂点击最喜欢的button,它会与吐司消息发疯。 但不是了。 它将等待2秒,然后将我的Toast对象设置为null,并允许它再次显示。

我的解决scheme是将所有的Toast引用保存在一个列表中,并在需要的时候创build一个方法来取消所有的Toast引用:

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

当你创build一个吐司这样做,并保存参考:

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

当你需要删除它们时:

 killAllToast(); 

你可以像在全局类中的静态方法一样创build它,并使用它来终止应用程序的所有敬酒。

这是我如何做到的。

 Toast toast; if(toast==null) toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG); else toast.setText(R.string.act_now_private_post_text); toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10); toast.show(); 

这是我对这个问题的简单回答:

首先在您的活动中创build一个全球Toast对象。

  private Toast example; 

现在,只要您想要调用新的Toast消息,只需执行以下操作:

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

这将所有敬酒保持在一个中央吐司,并删除吐司垃圾。 这是一个快速粗略的解决scheme,所以也许有一个更优雅的方式来做到这一点。

 mToast=Toast.makeText(this, "", Toast.LENGTH_LONG); showToast.setOnClickListener(new OnClickListener() { public void onClick(View v) { mToast.cancel(); String text=null; if(ON) { text="Toast is on"; } else { text="Toast is off"; } mToast.setText(text); mToast.setDuration(Toast.LENGTH_SHORT); mToast.show(); } }); 

你可以用这个

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

使用Madur上面的优秀答案,我把它扩展到了一个可以处理不同types消息的类:

 public class ToastManager { private Toast toastWarningMessage; private Toast toastAddMessage; ... public void messageWarning(Context context, String 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, String message) { if(toastAddMessage == null) { toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT); } else { toastAddMessage.cancel(); toastAddMessage.setText(message); } toastAddMessage.show(); } ... } 

这是从我的主要活动内部调用的:

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

对消息进行分类的原因是为了确保没有重要的消息被覆盖。 此解决scheme似乎很容易重用,因为它只涉及重命名Toast和函数名称。

当用户发送button时,对于相同的消息types,每次吐司只会取消。 唯一的问题是,如果用户可以垃圾邮件混合消息。 这导致第一个消息重复,一旦它终于到期其他消息显示一次。 不是一个真正的大问题,而是需要注意的一些问题。

我还没有研究过多个Toast实例可能的缺点。

在我的应用程序中,当应用程序进入后台时,排队的敬酒一次又一次地出现,所以我做了下面的解决问题。

添加代码以检测应用何时进入后台。 注册生命周期处理程序的一种方法。 欲了解更多详情参考

 registerActivityLifecycleCallbacks(new MyLifecycleHandler()); 

App.inBackground = true; 当应用程序去背景,并显示使用SmartToast类烤面包

 public class SmartToast { static ArrayList<WeakReference<Toast>> 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<WeakReference<Toast>> nullToasts = new ArrayList<>(); for (WeakReference<Toast> weakToast : toasts) { if(weakToast.get() == null) nullToasts.add(weakToast); } toasts.remove(nullToasts); } public static void cancelAll(){ for (WeakReference<Toast> weakToast : toasts) { if(weakToast.get() != null) weakToast.get().cancel(); } toasts.clear(); } } 

调用SmartToast.cancelAll(); 方法,当应用程序进入后台隐藏当前和所有悬而未决的敬酒。 代码很有趣。 请享用!

以下是如何禁用吐司消息,删除show()expression式。

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