Android 当我想展示其他祝酒词时,我可以取消之前的祝酒词吗?

Android 当我想展示其他祝酒词时,我可以取消之前的祝酒词吗?,android,toast,Android,Toast,在我的应用程序中,我为我的活动构建了一个日历小部件,当我将它滚动到上个月或下个月时,我让它做一个祝酒词并显示出来 问题是,祝酒词需要时间来显示,当我滚动速度足够快时,例如,我滚动到“2012/05”和“2012/06”并没有停顿地滚动到“2012/07”,我必须等待“2012/05”、“2012/06”、“2012/07”祝酒词一个接一个慢慢显示 Android似乎有一个无形的队列来管理祝酒 我如何清洁它,只展示最后的祝酒词?我是否可以在不等待的情况下立即展示特定的祝酒词? 我搜索了“andro

在我的应用程序中,我为我的活动构建了一个日历小部件,当我将它滚动到上个月或下个月时,我让它做一个祝酒词并显示出来

问题是,祝酒词需要时间来显示,当我滚动速度足够快时,例如,我滚动到“2012/05”和“2012/06”并没有停顿地滚动到“2012/07”,我必须等待“2012/05”、“2012/06”、“2012/07”祝酒词一个接一个慢慢显示

Android似乎有一个无形的队列来管理祝酒

我如何清洁它,只展示最后的祝酒词?我是否可以在不等待的情况下立即展示特定的祝酒词?

我搜索了“android.widget.Toast.java”并找到了一个方法
cancel()
,但不幸的是,它没有按如下方式工作

if (t != null) {
    t.cancel();
}
t = Toast.makeText(this.mContext, mHelper.getYear() + "年"
                + (mHelper.getMonth() + 1) + "月", Toast.LENGTH_SHORT);
t.show();
这是代码

final Toast toastobject = Toast.makeText(context, "This message will disappear when toast.close(); is called", Toast.LENGTH_SHORT);
现在您可以使用ToAsObject的对象。其


您可以在线程中使用它,也可以在任何时候关闭Toast。

Toast具有隐藏当前Toast消息的方法

public void cancel() {
    mTN.hide();
}

必要时尝试调用t.cancel()。

您需要在正确的对象上调用方法

toastObject.cancel()

以下是我的答案,摘自另一个类似的问题:

bload
类完全满足您的需要。最新的代码可以在GitHub上找到:


诀窍是跟踪显示的最后一个
吐司
,并取消该吐司

我所做的是创建一个
Toast
包装器,其中包含对最后显示的Toast的静态引用

当我需要显示新引用时,我首先取消静态引用,然后再显示新引用(并将其保存在静态引用中)

下面是我制作的
吹嘘
包装器的完整代码-它模仿了很多Toast方法,我可以使用它。默认情况下,
吹嘘
将取消上一个,因此您不会建立等待显示的祝酒队列

如果你只是想知道如何在退出应用程序时取消通知,你会在那里找到很多帮助



您可以重复使用吐司,这将使其立即显示

myToast.setText(toastMsg);
myToast.show();

您可以创建静态方法并使用它来显示toast:

public static Toast toast = null;
public static showToast(Context context,String msg){
if(toast!=null)             //this will cancel the toast on the screen if one exists
   toast.cancel();
toast = Toast.makeText(context,msg);
toast.show();
}

您只需要声明一个“Toast”变量,如下所示:

Toast toastMessage;
if (toastMessage!= null) {
    toastMessage.cancel();
}
toastMessage= Toast.makeText(context, "The message you want to display", duration);
toastMessage.show();
然后在你的函数中,这样做:

Toast toastMessage;
if (toastMessage!= null) {
    toastMessage.cancel();
}
toastMessage= Toast.makeText(context, "The message you want to display", duration);
toastMessage.show();

简单。如果要创建另一个toast,只需对toast调用方法.cancel()

首先在类的顶部定义一个Toast变量,如下所示

private Toast mToast;
稍后,当您想要创建一个新的吐司(并让旧的吐司消失)时, 这样做


你可以使用单杆技术。好了,让我们开始定义:

private Toast mToast;
private showOnce=false;
稍后,当你想展示祝酒词时:

if(showOnce==false){
  mToast=Toast.makeText(this, "Once!", Toast.LENGTH_LONG);
  mToast.show();
  showOnce=true;
}

当我们想展示另一个祝酒词时,有很多方法可以取消之前的祝酒词。下面我写了一个简单的方法来实现它。首先,我们必须创建一个可以在整个类中访问的变量

private Toast toast;
在创建整个类都可以访问的变量之后,我们必须在类中创建一个方法,该方法显示toast消息,并检查是否显示了前一个toast,然后取消它

   public void showToast(String message) {
    if (toast != null) {
        toast.cancel();
    }
    toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT);
    toast.show();
}
您可以通过运行时调用上述方法来更改toast消息

showToast("message 1");
//过了一段时间

showToast("message 2");

希望有帮助。

Toast是否有一个名为close()的方法?是的,我已经提供了一个参考。谢谢,但是Toast中没有可用的“close()”方法,只有一个“cancel()”,我尝试过(在上面的问题中)但在我的程序中不起作用。很抱歉,这是我的错误。我已将其更改为取消();我一直想弄明白,但老实说,我不知道为什么它不起作用。如果cancel()执行了它所说的操作,那么代码应该可以工作。也许你必须用别的东西来代替祝酒。@topxebec你的代码应该可以工作。它构成了我的
自夸的基础
下面的答案中的类参考在姜饼中似乎不起作用,顺便说一句,在那里旧的吐司保持可见,新的吐司在它之后出现!只是一个对我有效的修复,我将私有构造函数更改为public,然后我使用了您的类,比如:mBoast=new-bowl(new-Toast(this));mBoast.makeText(…);感谢分享您的自夸类=)@Richard Le Mesurier由于GlobalBulf的静态引用,它将泄漏内存。谢谢,这解决了此问题,而无需将活动与toast引用混在一起。最好将它放在github上,以便进一步启用improvements@Magicode那一天,我们在办公室里笑了很多~非常开玩笑~@JonA-是的,没错@topxebec-诀窍是保留原始toast的实例-
mTN
。这就是吸引很多人的原因。您不能只创建一个新的
Toast
并尝试取消它-您需要取消原来的一个。无需检查sToast是否为null。它将始终是。所需的代码最少,并按预期工作。我认为这是最好的答案。
showToast("message 1");
showToast("message 2");