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()s
和show()
的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();