关键在于跟踪上次显示的最后一个
Toast
,并取消它。
我所做的是创建了一个
Toast
包装器,其中包含对上一个显示的Toast的静态引用。
当我需要显示新的Toast时,我首先取消静态引用,然后显示新的Toast(并将其保存在静态中)。
这是我制作的
Boast
包装器的完整代码 - 它模仿了足够多的Toast方法供我使用。默认情况下,
Boast
将取消前一个,因此您不会积累等待显示的Toast队列。
这段代码可以在我的Github Gist中找到:
如果您只想知道如何在退出应用程序时取消通知,则可以在其中找到许多帮助。如果您有改进或建议,请随时分支并联系我们。这是一个非常古老的答案,但代码已经在一些应用程序中稳定运行了一段时间。
顺便说一句- 在大多数使用情况下,这应该是 Toast 的直接替代品。
package mobi.glowworm.lib.ui.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.support.annotation.Nullable;
import android.widget.Toast;
import java.lang.ref.WeakReference;
public class Boast {
@Nullable
private volatile static WeakReference<Boast> weakBoast = null;
@Nullable
private static Boast getGlobalBoast() {
if (weakBoast == null) {
return null;
}
return weakBoast.get();
}
private static void setGlobalBoast(@Nullable Boast globalBoast) {
Boast.weakBoast = new WeakReference<>(globalBoast);
}
private Toast internalToast;
private Boast(Toast toast) {
if (toast == null) {
throw new NullPointerException("Boast.Boast(Toast) requires a non-null parameter.");
}
internalToast = toast;
}
@SuppressLint("ShowToast")
public static Boast makeText(Context context, CharSequence text, int duration) {
return new Boast(Toast.makeText(context, text, duration));
}
@SuppressLint("ShowToast")
public static Boast makeText(Context context, int resId, int duration)
throws Resources.NotFoundException {
return new Boast(Toast.makeText(context, resId, duration));
}
@SuppressLint("ShowToast")
public static Boast makeText(Context context, CharSequence text) {
return new Boast(Toast.makeText(context, text, Toast.LENGTH_SHORT));
}
@SuppressLint("ShowToast")
public static Boast makeText(Context context, int resId) throws Resources.NotFoundException {
return new Boast(Toast.makeText(context, resId, Toast.LENGTH_SHORT));
}
public static void showText(Context context, CharSequence text, int duration) {
Boast.makeText(context, text, duration).show();
}
public static void showText(Context context, int resId, int duration)
throws Resources.NotFoundException {
Boast.makeText(context, resId, duration).show();
}
public static void showText(Context context, CharSequence text) {
Boast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
public static void showText(Context context, int resId) throws Resources.NotFoundException {
Boast.makeText(context, resId, Toast.LENGTH_SHORT).show();
}
public void cancel() {
internalToast.cancel();
}
public void show() {
show(true);
}
public void show(boolean cancelCurrent) {
if (cancelCurrent) {
final Boast cachedGlobalBoast = getGlobalBoast();
if ((cachedGlobalBoast != null)) {
cachedGlobalBoast.cancel();
}
}
setGlobalBoast(this);
internalToast.show();
}
}