56

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

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

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

不应该是这样的:)

4

17 回答 17

82

我的解决方案是在活动中初始化一个 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();
}
于 2010-12-19T22:40:30.873 回答
32

如何禁用当前正在处理的所有 toast 消息?

Toasts您可以通过调用对象cancel()来取消个人。ToastAFAIK,但是,您无法取消所有未完成Toasts的。

于 2010-05-02T23:27:55.087 回答
13

检查是否已经显示了 toast 怎么办?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}
于 2012-07-03T21:12:05.800 回答
8

buttonMudar 的解决方案在类似的问题上对我来说效果很好 - 在多次点击后,我有各种吐司堆积在积压中。

setText()s一个具有不同和s的 Toast 实例show()正是我正在寻找的答案 - 单击新按钮后,先前的消息就会取消。发现

仅供参考,这就是我所做的...

OnCreate

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

在每个OnClick

myToast.setText(R.string.toast1);
myToast.show();
于 2011-03-21T22:25:02.323 回答
5

我的解决方案是将所有 toast 引用保存在一个列表中,并在需要时创建一个方法来取消它们:

private ArrayList<Toast> msjsToast = new ArrayList<Toast>();

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

您可以像在全局类中创建一个静态方法一样创建它,并使用它来杀死应用程序的所有 toast。

于 2015-11-16T16:21:02.440 回答
4

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

首先在您的活动中创建一个全局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 垃圾邮件。这是一个快速粗略的解决方案,所以也许有一种更优雅的方法来做到这一点。

于 2016-03-12T01:56:28.243 回答
3

我想我找到了一种方法来让敬酒消息不为我排队。以为我会分享。

这部分在顶部。

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 并允许它再次显示。

于 2012-04-26T03:10:32.977 回答
3

在函数外部创建一个 Toast 对象onClick并使用下面的代码。它将停止任何现有的 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();
}
于 2018-06-16T18:50:40.263 回答
3

Kotlin Version通过Extension Function

取消先前显示Toast并立即显示新的最好方法是保留对当前显示的引用以便Toast能够取消它。所以使用这些扩展函数真的很有帮助:


ToastUtils.kt

import android.content.Context
import android.widget.Toast
import androidx.annotation.StringRes

/**
 * @author aminography
 */

private var toast: Toast? = null

fun Context.toast(message: CharSequence?) {
    toast?.cancel()
    toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_SHORT) }?.apply { show() }
}

fun Context.longToast(message: CharSequence?) {
    toast?.cancel()
    toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_LONG) }?.apply { show() }
}

fun Context.toast(@StringRes message: Int) {
    toast?.cancel()
    toast = Toast.makeText(this, message, Toast.LENGTH_SHORT).apply { show() }
}

fun Context.longToast(@StringRes message: Int) {
    toast?.cancel()
    toast = Toast.makeText(this, message, Toast.LENGTH_LONG).apply { show() }
}

用法:

context.toast("Text 1")
context.longToast("Text 2")

context.toast(R.string.text3)
context.longToast(R.string.text4)
于 2020-08-12T07:43:06.157 回答
1

我就是这样做的。

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();
于 2013-07-31T12:35:52.077 回答
1

Kotlin中,这很容易解决。

在我的示例中,我在用户单击按钮时切换排序类型。如果用户快速点击按钮,它将在显示sortToast另一个之前取消当前显示。

private var sortToast: Toast? = null

sortButton.onClickListener {
    sortToast?.cancel()
    sortToast = Toast.makeText(context, "Sort by toggled", Toast.LENGTH_SHORT)
    sortToast?.show()
}
于 2020-02-28T19:19:20.280 回答
0

使用上面 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 都会取消。唯一的问题是用户是否可以发送混杂的垃圾邮件。这会导致第一条消息重复,一旦它最终过期,其他消息就会显示一次。不是一个真正的大问题,但需要注意的事情。

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

于 2015-03-09T17:13:46.070 回答
0
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();

            }
        });
于 2011-08-18T04:44:26.993 回答
0

可以这样用。。

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();
}
}
于 2014-07-26T15:49:03.323 回答
0

这些怎么样 !?

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();
..
}
于 2018-07-26T12:06:31.847 回答
0

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

添加代码以检测应用何时进入后台。一种注册生命周期处理程序的方法。有关更多详细信息,请参阅

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true;当应用程序进入后台并使用 SmartToast 类显示 toast

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();当应用程序进入后台以隐藏当前和所有待处理的 toast 时调用方法。代码很有趣。享受!

于 2016-12-14T08:31:27.487 回答
-11

Here's how to disable toast messages, remove show() expression.

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

//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();
于 2012-03-27T09:36:52.733 回答