android - 如何防止多个 Toast 重叠

标签 android toast

我一直在使用一个常见的“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/

相关文章:

android - 使用 WiFi 获取位置详细信息

android - 捕获 toast 事件(来自任何应用程序)并获取 toast 消息

android - “Fluttertoast”已被弃用,不应使用。将在进一步版本中删除

android - 如何使用xml文件在android中实现这种类型的Progressbar

android - resolve of scanning 无法解析或不是字段

android - 如何检查从 android 中的广播接收器接收到的操作类型?

Android Toast.makeText(this, ....) 不适用于 AppCompatActivity

android - 如何以编程方式设置 Android 设备日期/时间

windows-8 - 我可以将图像作为数据 URI 嵌入到 Windows 8/10 Toast 通知中吗?

android - 如果 auth 失败,如何显示 toast jetpack compose firebase if else @Composable 调用只能在 @Composable 函数的上下文中发生