我正在使用以下代码来显示比平时更长的吐司,并且它可以更长时间地显示想要的文本,除了时间之外,用户对普通吐司的感知没有区别。
Toast toast;
CountDownTimer mcd;
[...]
toast=Toast.makeText(getApplicationContext(),
StaticMethods.giveStringAccordingtoLanguage(action,language),
Toast.LENGTH_LONG);
mcd=new CountDownTimer(6000, 50)
{
public void onTick(long millisUntilFinished) {toast.show();}
public void onFinish() {toast.show();}
}.start();
但是当用户退出应用程序时,如果显示该自定义Toast,它会一直显示,直到时间结束。
当应用程序退出时,我尝试用这样的代码解决它:
try
{
toast.cancel();
}
catch (Exception e)
{
}
try
{
mcd.cancel();
}
catch (Exception e)
{
}
无论如何它根本不起作用。
我还试图用这样的代码重新定义刻度线的行为:
mcd.onTick(long millisUntilFinished) {toast.cancel();}
mcd.onFinish() {toast.cancel();}
但是这个代码甚至不正确,它看起来只有在通过new创建一个新的CountDownTimer对象时才是正确的。
关于如何解决这个问题的任何想法?在最糟糕的情况下,我可以弹出一个对话框,在退出应用程序后不会继续显示,但我更喜欢这样做,因为我认为对用户来说会更好。
答案 0 :(得分:0)
如果cancel()和hide()不起作用,您应该尝试使用看起来像该活动/片段的Toast的动画来实现自定义视图。这样,视图可以随时关闭,并且只能附加到该活动/片段。
请参阅以下stackoverflow answer
我希望这有帮助!
答案 1 :(得分:0)
你说"继续展示直到它的时间结束" - 这次是正常的LENGTH_LONG时间还是6000ms的时间?如果它是LENGTH_LONG我不会打扰,因为这是Toast的正常行为。 如果你想使用LENGTH_SHORT,你可以缩短时间。
如果是6000毫秒,取消CountdownTimer有问题。你在哪里调用代码中的mcd.cancel()?在Activity#onDestroy()中?确保(通过调试)调用mcd.cancel()。
编辑:吐司累积
我猜,它可能被称为Toast累积。 Toasts不是属于您的应用的普通视图,而是创建为远程视图。所以我想,如果你调用toast.show(),它会告诉系统显示该视图,该视图会创建某种副本并显示它。一次又一次地调用show()将这些show请求排入队列,而cancel()只取消最后一次请求。
长话短说:在CountDownTimer的onTick()和onFinish()方法中,尝试在调用toast.show()之前直接调用toast.cancel()。这应该避免吐司的累积(排队) - 我希望它不会闪烁,但我怀疑它,因为淡出动画吐司正在使用。