Android-隐藏所有显示的Toast消息
如何删除当前显示的所有吐司消息?
在我的应用程序中,有一个列表,当用户单击某个项目时,会显示一条敬酒消息,10条-10条吐司消息。
因此,如果用户单击10次,然后按菜单按钮,则他们必须等待几秒钟才能读取菜单选项文本。
它不应该那样:)
15个解决方案
79 votes
我的解决方案是在活动中初始化一个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();
}
Mudar answered 2020-01-07T21:03:43Z
31 votes
如何禁用所有吐司消息 目前正在处理中?
您可以通过在Toast对象上调用cancel()来取消单个Toasts。 AFAIK,不过您无法取消所有未解决的Toasts。
CommonsWare answered 2020-01-07T21:04:07Z
12 votes
如何检查是否已显示烤面包?
private Toast toast;
...
void showToast() {
if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
toast.show();
}
}
Justin Muller answered 2020-01-07T21:04:27Z
8 votes
Mudar的解决方案在类似的问题上对我来说效果很好-多次单击OnClick单击后,积压了很多吐司。
我一直在寻找一个具有不同的OnClick和show()s的Toast实例,这正是我一直在寻找的答案-单击新按钮后,先前的消息即被取消。 发现
仅供参考,这是我所做的...
在OnClick中:
final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
在每个OnClick中:
myToast.setText(R.string.toast1);
myToast.show();
BasicPleasureModel answered 2020-01-07T21:05:05Z
4 votes
我的解决方案是将所有吐司参考文献保存在列表中,并制定一种在需要时取消所有吐司参考文献的方法:
private ArrayList msjsToast = new ArrayList();
private void killAllToast(){
for(Toast t:msjsToast){
if(t!=null) {
t.cancel();
}
}
msjsToast.clear();
}
创建Toast时,请按照以下方式保存参考:
Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);
当您需要删除它们时:
killAllToast();
您可以像在全局类中的静态方法一样创建它,并使用它杀死应用程序的所有吐司。
user23 answered 2020-01-07T21:05:38Z
3 votes
我想我找到了一种使敬酒消息不排队的方法。 以为我会分享。
这部分放在顶部。
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);
}
它比任何东西都更像是骇客。 但是,只要有人喜欢我的应用程序的一部分,我就会显示敬酒消息。 如果他们发疯,请单击“收藏夹”按钮,它就会因敬酒消息而发疯。 但现在不再。 它将等待2秒钟,然后将我的toast对象设置为null并再次显示。
S.A.Jay answered 2020-01-07T21:06:12Z
3 votes
这是我对问题的简单答案:
首先,在您的活动中创建一个全局Toast对象。
private Toast example;
现在,每当您要调用新的Toast消息时,只需执行以下操作:
if(buttonClicked) {
example.cancel();
example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
example.setText("Button Clicked");
example.show();
}
这样可以将所有Toast保留在一个Toast中央,并删除Toast垃圾邮件。 这是一个快速的粗略解决方案,因此也许有更优雅的方法可以做到这一点。
Roymunson answered 2020-01-07T21:06:45Z
2 votes
在onClick函数外部创建Toast对象,并使用下面的代码。它将停止任何现有的Toast并启动最新的Toast。
Toast mToast;
public void onClick(String abc) {
if(mToast!=null)
mToast.cancel();
Context context = this;
mToast = Toast.makeText(context, abc, Toast.LENGTH_SHORT);
mToast.show();
}
Akash Gupta answered 2020-01-07T21:07:05Z
1 votes
这就是我的方法。
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();
Victor Odiah answered 2020-01-07T21:07:25Z
0 votes
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();
}
});
balu answered 2020-01-07T21:07:40Z
0 votes
您可以这样使用。
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();
}
}
İlter Engin KIZILGÜN answered 2020-01-07T21:08:00Z
0 votes
使用上面的Madur出色的答案,我将其扩展为可以处理不同类型消息的类:
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);
}
对消息进行分类的原因是要确保没有覆盖重要消息。 该解决方案似乎很容易重用,因为它仅涉及重命名Toast和函数名称。
当用户向按钮发送垃圾邮件时,对于相同的消息类型,吐司每次都将取消。 唯一的问题是用户是否可以将混合消息发送给垃圾邮件。 这将导致第一个消息重复,并且一旦它最终到期,其他消息将分别显示一次。 这并不是一个很大的问题,但是需要注意。
我没有研究过拥有多个Toast实例的可能弊端。
David answered 2020-01-07T21:08:39Z
0 votes
在我的应用程序中,当应用程序进入后台时,排队敬酒一次又一次地出现,所以我做了以下工作来解决问题。
添加代码以检测应用何时进入后台。 注册生命周期处理程序的一种方法。 有关更多详细信息,请参考
registerActivityLifecycleCallbacks(new MyLifecycleHandler());
App.inBackground = true;当应用程序进入后台并使用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();
}
}
当应用程序进入后台以隐藏当前和所有待处理的吐司时,请调用SmartToast.cancelAll();方法。 代码很有趣。 请享用!
Qamar answered 2020-01-07T21:09:12Z
0 votes
这些怎么样 !?
private Toast toast;
...
// Methods for short toast messages and long toast messages
private void showShortToast(String message) {
if(null != toast) toast.cancel();
(toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT)).show();
}
private void showLongToast(String message) {
if(null != toast) toast.cancel();
(toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG)).show();
}
并在onPause()
@Override
protected void onPause() {
...
if(null != toast) toast.cancel();
..
}
Pramod P K answered 2020-01-07T21:09:36Z
-11 votes
以下是禁用Toast消息,删除show()表达式的方法。
//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT);
//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();
SKf answered 2020-01-07T21:09:56Z