自定义Toast的取消功能无法正常工作

7

我看到很多关于取消Toast的问题,但它们都不起作用。

我有一个自定义的Toast。该代码与http://developer.android.com/guide/topics/ui/notifiers/toasts.html#CustomToastView中的所有行都相同,除了一行。

区别如下:

  1. The toast variable is defined as a class variable
  2. The entire java code is written in a method.
  3. In the start of this method, I have added the following line to cancel the toast.

    if (toast!=null){
        toast.cancel();
    }
    

当用户选择(onClick)视图/布局时,会调用该方法。问题在于当用户选择几次时,Toast将被排队(toast.cancel无法工作)。

有什么解决方案吗?

[更新] 我尝试将Toast对象设置为静态变量。仍然不起作用。


你有检查过 toast.cancel() 是否被调用了吗?如果你从未给 toast 赋值,那么 toast 将会是 null,toast.cancel() 就永远不会被调用。 - Mike dg
@Mike-dg 是的。我在调试器中检查了一下,代码已经到达那里了。然而,toast.cancel() 对于这个 Toast 没有效果。[更新] 再次通过 Log 消息进行了检查。是的,它肯定正在 if 语句内部到达。 - GSree
可能是Android取消Toast当退出应用程序和Toast正在显示时的重复问题。 - Richard Le Mesurier
4个回答

7

我曾经遇到同样的问题(自定义Toast排队),并找到了解决方案。在我的情况下,它起作用了。

首先将自定义Toast对象设置为null

  • 如果它是null,则使用"new"创建新的自定义Toast对象。

  • 只要您在同一个活动中,不要使用"new"来创建新对象。相反,使用该对象。由于此时setText()无法工作,请像处理自定义Toast一样使用setView()

  • 通过这种方式,show(),cancel(),show(),cancel()正如我所期望的那样工作。没有延迟,也没有排队。

希望这可以帮助你。


2
最终,我创建了一个自定义对话框,这样用户就被阻止做其他事情(避免多个toast弹出)。当用户点击相同的区域时,添加了一个onClick监听器事件来关闭对话框。
遗憾的是,Toast.cancel()不起作用。

Toast.cancel() 绝对有效 - 请查看相关答案和示例Github代码片段 - Richard Le Mesurier

0
在上面的代码中,您使用了toast.setDuration(Toast.LENGTH_LONG);,但是在下面的代码中,您使用了toast.setDuration(Toast.LENGTH_SHORT);或者设置特定的时间。Toast会自动取消,我们无法手动取消它。

1
嗯...Toast.LENGTH_SHORT会使时间更短。但这并没有解决问题。我不想让它太小,以至于用户看不到消息。在Toast的文档中,有一个cancel()方法。不确定为什么它不起作用。 - GSree

-2

使用此代码自定义文本:

LayoutInflater mInflater=LayoutInflater.from(context);
View view=mInflater.inflate(R.layout.tost_layout,null);
Toast toast=new Toast(this);
toast.setView(view);
toast.show();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接