在Android中,当我创建Toast并显示它们时,它们会连续出现。问题是我有一个检查某些字段的按钮,如果用户输入了错误的数据,则会显示Toast。如果用户反复触摸按钮,则会累积Toasts,并且消息不会在几秒钟内消失。
哪种方法可以避免这种情况?
答案 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();
}