防止Toast排队

时间:2014-07-08 19:23:40

标签: android toast

当我的应用启动但尚未加载文件时,用户点击该按钮时会获得Toast。加载大约需要半秒钟,因此,由于他能够多次单击该按钮,因此可以在之后显示多个Toast

我尝试将Toast对象设置为MainActivity类的属性,但它与NullPointerException s崩溃。 实施:

Toast lToast;
(...)
public void exampleMethod() {
    if(lToast == null) {
        lToast.makeText(this, "Noch kein Sound geladen.", Toast.LENGTH_SHORT);
        lToast.show();
    }
}

是否可以阻止Toast排队而无需拥有本地属性?如果没有,我做错了什么?

4 个答案:

答案 0 :(得分:3)

我不确定你的意思是什么"没有本地属性",但是深入研究android代码,你会发现长短延迟如下

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

所以当你启动你的吐司时,如果你捕捉到这样的时间戳

long lastToastTimestamp = System.currentTimeMillis();

你应该能够阻止多个Toast消息

if (System.currentTimeMillis() - lastToastTimestamp > 2000)
{
   lastToastTimestamp = System.currentTimeMillis();
   Toast.makeText(this, "Noch kein Sound geladen.", Toast.LENGTH_SHORT).show();
}

或者这个

制作字段:

Toast mToast = null;

然后是代码:

if (mToast == null)
{
    mToast = Toast.makeText(context, "Noch kein Sound geladen.", Toast.LENGTH_SHORT);
    mToast.show();
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run()
        {
            mToast = null;
        }
    }, 2000);
}

如果你想让它变得更复杂,你可以创建自己的队列,并且只插入将在前一个到期时显示的新吐司,如果给予toast的文本与当前的那个不同而且所有队列中的那些。

答案 1 :(得分:2)

Toast.makeText(...)是返回Toast实例的Toast类的静态成员。您已声明Toast lToast个对象但未对其进行初始化。

变化:

lToast.makeText(this, "Noch kein Sound geladen.", Toast.LENGTH_SHORT);

lToast = Toast.makeText(this, "Noch kein Sound geladen.", Toast.LENGTH_SHORT);

我不确定这是否有效,但会阻止提升NullPointerException

答案 2 :(得分:1)

WIIIJBD 已经a wonderful answer

但是,在您的情况下,您可以禁用Toast而不是屏蔽Button

您可以在onClick()中禁用该按钮,然后在完成加载任何内容后再次收到回调时再将onClickListener()设置为某个位置。

答案 3 :(得分:0)

我知道你的问题不是那个,但无论如何...我使用并推荐使用的库是Crouton,这是一个与Toast强烈相关的库,有很多自定义!< / p>

希望它有所帮助!