我一直在使用一个常见的“myToast”,在发出新的toast之前,我使用“myToast.cancel()
”。对于Android v2.3和更早的版本,这个功能非常好。当需要发送新的toast时,如果旧的toast还在屏幕上,被取消(并立即消失)以替换为新的吐司。如果用户多次按下需要提醒的键,这可以避免堆积一堆toast(和其他条件)。我的实际情况是按错键时出现一个吐司,没有按清除键时出现另一个吐司。
对于Android 4.0和4.1,在下一个吐司之前发出myToast.cancel()
会同时取消当前和下一个toast。当前的cancel()
API确实指示它取消当前和下一个toast(这似乎相当愚蠢)。为什么要取消要发出的toast呢?
有没有什么想法可以让取消功能在Android版本中保持一致(以及在v2.3及更早版本中的工作方式)?
我会尝试一些不优雅的双吐司系统,跟踪哪些吐司正在使用,但它似乎是这样一个痛苦的工作,围绕这种不良行为在4.x中得到什么工作完美和逻辑在旧的Android版本。
好了,我解决了这个问题,但是它并没有我希望的那么干净。我实现了一个双吐司方法,它在两个toast之间交替。首先,我们为OnCreate
之前的Activity定义toast:
Toast toast0;
Toast toast1;
private static boolean lastToast0 = true;
在创建时:
toast0 = new Toast(getApplicationContext());
toast0.cancel();
toast1 = new Toast(getApplicationContext());
toast1.cancel();
最后,当我需要同时显示吐司和取消之前的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;
}
如果您只需要取消现有的吐司(在它超时之前),请用途:
toast0.cancel();
toast1.cancel();
已在Nexus 7(4.1)、模拟器4.0和几台Android 2.2、2.3设备上进行测试。
9条答案
按热度按时间nbewdwxp1#
不要调用
cancel()
。尝试重置文本并调用show()
。这将自动取消最后一个吐司如果您继续使用相同的
myToast
,而不是每次都创建一个,我猜它们不会堆叠起来。xvw2m8pv2#
难道nandeesh的解决方案对你不起作用吗?他的解决方案比用两种不同的吐司要干净。
例如,(扩展他/她的答案)在onCreate之前,我们会声明吐司:
在onCreate中我们必须使用makeToast初始化它(否则我们会得到一个错误):
每当我们想播放吐司时,我们只需调用:
这将取代之前的吐司。
vxqlmq5t3#
以下是我从另一个类似问题中抄来的答案:
Boast
类正好完成了您所需要的。诀窍是跟踪显示的最后一个
Toast
,然后取消那个。我所做的是创建一个
Toast
Package 器,它包含对最后显示的吐司的静态引用。当我需要显示一个新对象时,我首先取消静态引用,然后再显示新对象(并将其保存在静态中)。
下面是我制作的
Boast
Package 器的完整代码--它模仿了吐司方法的很多部分,我可以使用它。默认情况下,Boast
将取消前一个方法,因此您不会建立等待显示的Toast队列。如果你只是想知道如何在退出应用程序时取消通知,你会在那里找到很多帮助。
wmtdaxz34#
创建一个java类***ShowToast.java***,如下所示
那就叫它
ifsvaxew5#
cancel()
恐怕什么也做不了。我建议使用Crouton https://github.com/keyboardsurfer/Crouton
fjaof16o6#
这是我的解决方案工程完美的4.* 和2.3 Android版本
7cjasjjr7#
创建吐司对象:
现在使用下面的代码来显示吐司。
qlvxas9a8#
创建一个新函数并调用它。
k75qkfdt9#
Kotlin方法: