Android - 隐藏所有显示的Toast消息

cra*_*zyV 53 android messages hide toast

如何删除当前显示的所有Toast消息?

在我的应用程序中,有一个列表,当用户点击某个项目时,会显示一个Toast消息,10个项目--10个Toast消息.

因此,如果用户单击10次,然后按下菜单按钮,他们必须等待几秒钟,直到他们能够读取菜单选项文本.

它应该不是那样的:)

Mud*_*dar 79

我的解决方案是在活动中初始化单个Toast.然后在每次单击时更改其文本.

Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
  mToast.setText("This is a");
  mToast.show();
} else if (b) {
  mToast.setText("This is b");
  mToast.show();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,上面的CommonsWare已经解释过禁用排队的吐司消息列表...... :) thx,但是sry ..我想你误解了这个问题! (2认同)
  • 虽然这是一个很好的答案,但实际上它实际上并不是相同的行为.有了这个解决方案,你就不可能有两个相互显示的祝酒词. (2认同)

Com*_*are 31

如何禁用当前正在处理的所有Toast消息?

您可以Toasts通过调用cancel()Toast对象来取消个人.AFAIK,你没有办法取消所有杰出的Toasts,但是.

  • 这是我最新的Android宠儿:无法取消所有排队的Toasts. (8认同)
  • 真是令人失望:如果你取消当前的吐司,那么只有在这个吐司即将展示的时间之后才会显示随后的祝酒词. (3认同)

Jus*_*ler 12

检查吐司是否已经显示怎么样?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*del 8

Mudar的解决方案对我来说在一个类似的问题上工作得非常漂亮 - 经过多次button点击后,我在待办事项中堆积了各种各样的祝酒词.

一个Toast with different setText()sshow()s的实例就是我正在寻找的答案 - 一旦点击一个新按钮就会取消上一条消息.发现

仅供参考,这是我做的......

OnCreate:

    final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);
Run Code Online (Sandbox Code Playgroud)

每个内部OnClick:

myToast.setText(R.string.toast1);
myToast.show();
Run Code Online (Sandbox Code Playgroud)


ami*_*phy 8

\xe2\x80\xa2Kotlin Version通过Extension Function

\n

取消先前显示Toast并立即显示新显示的最佳方法是保留对当前显示的引用Toast,以便能够取消它。因此,使用这些扩展函数确实有帮助:

\n
\n

ToastUtils.kt

\n
import android.content.Context\nimport android.widget.Toast\nimport androidx.annotation.StringRes\n\n/**\n * @author aminography\n */\n\nprivate var toast: Toast? = null\n\nfun Context.toast(message: CharSequence?) {\n    toast?.cancel()\n    toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_SHORT) }?.apply { show() }\n}\n\nfun Context.longToast(message: CharSequence?) {\n    toast?.cancel()\n    toast = message?.let { Toast.makeText(this, it, Toast.LENGTH_LONG) }?.apply { show() }\n}\n\nfun Context.toast(@StringRes message: Int) {\n    toast?.cancel()\n    toast = Toast.makeText(this, message, Toast.LENGTH_SHORT).apply { show() }\n}\n\nfun Context.longToast(@StringRes message: Int) {\n    toast?.cancel()\n    toast = Toast.makeText(this, message, Toast.LENGTH_LONG).apply { show() }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

用法:

\n
context.toast("Text 1")\ncontext.longToast("Text 2")\n\ncontext.toast(R.string.text3)\ncontext.longToast(R.string.text4)\n
Run Code Online (Sandbox Code Playgroud)\n


use*_*r23 5

我的解决方案是将所有 toast 引用保存在一个列表中,并在需要时创建一个方法来取消所有引用:

private ArrayList<Toast> msjsToast = new ArrayList<Toast>();

private void killAllToast(){
    for(Toast t:msjsToast){
        if(t!=null) {
            t.cancel();
        }
    }
    msjsToast.clear();
}
Run Code Online (Sandbox Code Playgroud)

当您创建 Toast 时,请这样做并保存参考:

Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);
Run Code Online (Sandbox Code Playgroud)

当您需要删除它们时:

killAllToast();
Run Code Online (Sandbox Code Playgroud)

您可以像在全局类中创建静态方法一样创建它,并使用它来终止应用程序的所有 toast。


Roy*_*son 5

这是我对这个问题的简单回答:

首先在您的活动中创建一个全局Toast对象。

    private Toast example;
Run Code Online (Sandbox Code Playgroud)

现在,每当您想调用新的 Toast 消息时,只需执行以下操作:

if(buttonClicked) {
    example.cancel();
    example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
    example.setText("Button Clicked");
    example.show();
}
Run Code Online (Sandbox Code Playgroud)

这会将所有 Toast 保留在一个中央 Toast 中,并删除 Toast 垃圾邮件。这是一个快速粗略的解决方案,因此也许有一种更优雅的方法来做到这一点。