在Android中避免Toast积累的最佳方法

时间:2013-09-07 18:23:01

标签: java android

在Android中,当我创建Toast并显示它们时,它们会连续出现。问题是我有一个检查某些字段的按钮,如果用户输入了错误的数据,则会显示Toast。如果用户反复触摸按钮,则会累积Toasts,并且消息不会在几秒钟内消失。

哪种方法可以避免这种情况?

  • 我可以保存对最后一个Toast的引用并在创建新Toast之前将其删除吗?
  • 我应该为所有邮件使用相同的Toast吗?
  • 我可以使用任何方法在制作和显示新的Toast之前清除所有的应用程序Toast吗?

4 个答案:

答案 0 :(得分:30)

您可以使用cancel()的{​​{1}}方法来关闭显示Toast。

使用变量在显示时保留对每个Toast的引用,只需在显示另一个Toast之前调用Toast

cancel()

你甚至可以把它包装成一个像这样的小类:

private Toast mToast = null; // <-- keep this in your Activity or even in a custom Application class

//... show one Toast
if (mToast != null) mToast.cancel();
mToast = Toast.makeText(context, text, duration);
mToast.show();

//... show another Toast
if (mToast != null) mToast.cancel();
mToast = Toast.makeText(context, text, duration);
mToast.show();

// and so on.

并在代码中使用它,如下所示:

public class SingleToast {

    private static Toast mToast;

    public static void show(Context context, String text, int duration) {
        if (mToast != null) mToast.cancel();
        mToast = Toast.makeText(context, text, duration);
        mToast.show();
    }
}

//

答案 1 :(得分:1)

此活动中只有一个Toast。

private Toast toast = null;

然后在创建另一个之前,检查当前是否显示Toast

if (toast == null || !toast.getView().isShown()) {
    if (toast != null) {
        toast.cancel();
    }
    toast = Toast.makeToast("Your text", Toast.LENGTH).show();
}

如果您需要显示不同的短信,您甚至可以将最后一个片段设置为私有方法showToast(text)来重构代码。

答案 2 :(得分:1)

在Kotlin中,我使用这个:

private lateinit var toast: Toast

fun showToast(@StringRes stringId: Int, toastLength: Int = Toast.LENGTH_SHORT)
{
    if (this::toast.isInitialized)
    {
        toast.cancel()
    }

    toast = Toast.makeText(
        requireContext(),
        getString(stringId),
        toastLength
    )

    toast.show()
}

或者在许多片段中使用它时,可以扩展Fragment类,因此功能showToast不必在每个片段中都包含。

open class OneToastFragment : Fragment()
{
    private lateinit var toast: Toast

    fun showToast(@StringRes stringId: Int, toastLength: Int = Toast.LENGTH_SHORT)
    {
        if (this::toast.isInitialized)
        {
            toast.cancel()
        }

        toast = Toast.makeText(
            requireContext(),
            getString(stringId),
            toastLength
        )

        toast.show()
    }
}

此外,使用Toasty library也很容易。

Gradle项目:

repositories {
    ...
    maven { url "https://jitpack.io" }
}

Gradle模块应用:

dependencies {
    ...
    implementation 'com.github.GrenderG:Toasty:1.4.2'
}

活动类中的onCreate:

Toasty.Config.getInstance().allowQueue(false).apply(); // set this to avoid toast acumulations

//Test:
int x = 0;
Toasty.info(this, Integer.toString(x++), Toast.LENGTH_SHORT, true).show();
Toasty.info(this, Integer.toString(x++), Toast.LENGTH_SHORT, true).show();
Toasty.info(this, Integer.toString(x++), Toast.LENGTH_SHORT, true).show();

//This will only show a toast with message `2` 

答案 3 :(得分:0)

这只会在预定义的延迟(在本例中为 3 秒)后进行新的 toast,而不管用户按下该按钮多少次。

科特林

var mLastToastTime: Long = 0
val mNewToastInterval: Int = 3000 // milliseconds

if (System.currentTimeMillis() - mLastToastTime > mNewToastInterval) {
    showToast()
    mLastToastTime = System.currentTimeMillis().toInt()
}

Java

int mLastToastTime = 0;
int mNewToastInterval = 3000; // milliseconds

if (System.currentTimeMillis() - mLastToastTime > mNewToastInterval) {
       showToast();
       mLastToastTime = System.currentTimeMillis();
}