我一直在使用一个常见的“myToast”,我在发布新的 toast 之前使用“myToast.cancel()
。对于 Android v2.3 和更早版本,这很好用。当需要发送新的 toast ,如果仍然在屏幕上,旧的 toast 将被取消(并立即消失)以替换为新的 toast。这样可以避免用户多次按下需要的键时堆积一堆 toast警报(和其他条件)。我的实际情况是按下错误键时出现一个 toast,如果未按下 Clear 键则出现另一个。
对于 Android 4.0 和 4.1,在下一个 toast 之前发出 myToast.cancel()
会杀死当前和下一个 toast。当前的 cancel()
API 确实表明它取消了当前和下一个 toast(这看起来相当愚蠢)。为什么要取消你想举的 toast ?
关于使取消在 Android 版本(以及它在 v2.3 和更早版本中的工作方式)一致的任何想法?
我将尝试一些不雅的双 toast 系统,它可以跟踪正在使用的 toast,但在 4.x 中解决这种不良行为似乎很难在较旧的 Android 版本中完美且合乎逻辑地工作。
好的,我解决了,但它不像我希望的那样干净。我实现了一种双 toast 方法,它在两个 toast 之间交替。首先,我们在 OnCreate
之前定义 Activity 的 toast:
Toast toast0;
Toast toast1;
private static boolean lastToast0 = true;
在 OnCreate 中:
toast0 = new Toast(getApplicationContext());
toast0.cancel();
toast1 = new Toast(getApplicationContext());
toast1.cancel();
最后,当我需要同时显示 toast 并取消之前的 toast 时,我会使用类似于:
if (lastToast0) {
toast0.cancel();
toast1.setDuration(Toast.LENGTH_LONG);
toast1.setText("new message");
toast1.show();
lastToast0 = false;
} else {
toast1.cancel();
toast0.setDuration(Toast.LENGTH_LONG);
toast0.setText("new message");
toast0.show();
lastToast0 = true;
}
如果您只需要取消现有的 toast(在超时之前),请使用:
toast0.cancel();
toast1.cancel();
在 Nexus 7 (4.1)、Emulator 4.0 和多款搭载 Android 2.2、2.3 的设备上测试。
最佳答案
而不是调用 cancel()
。尝试重置文本并调用 show()
。这应该会自行取消最后一个 toast
myToast.setText("wrong key")
myToast.show();
如果你继续使用相同的 myToast
而不是每次都创建一个,我猜它们不会叠加。
关于android - 如何防止多个 Toast 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922516/