杀死Android Toast?

3

我有一个按钮,点击按钮后会出现toast提示,如果用户多次点击按钮并转到上一个活动甚至关闭应用程序,toast提示仍然可见。

如何在用户转到任何其他活动时完成或取消toast提示,或者如何防止生成toast提示?

Toast.makeText(getApplicationContext(), "Enter correct goal!",
                        Toast.LENGTH_SHORT).show()

你真的希望用户能够显示多个toast吗?也许你可以通过保存toast已经出现过来防止这种情况。 - JacksOnF1re
@JacksOnF1re,我该怎么做?我对这项技术很陌生。 - PK__
好的,简单明了的方法是在按钮被点击并且Toast出现时,设置一个布尔变量(例如位于您的活动中)为true。例如,如果(toastShown == false){showToast();toastShown=true;} 因此,只有在变量为false时才显示Toast,并在之后将其设置为true。 - JacksOnF1re
3个回答

4

使用handler尝试通过cancel()取消Toast

Toast toast = Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_SHORT);

toast.show();

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
 @Override
 public void run() {
 toast.cancel(); 
 }
}, 500);

2
您可以通过在Toast对象上调用cancel()来取消单个Toast。据我所知,目前没有办法取消所有未完成的Toast
当在活动中调用finish()时,将执行onDestroy()方法,该方法可以执行以下操作:
1.关闭活动管理的任何对话框。
2.关闭活动管理的任何光标。
3.关闭任何打开的搜索对话框。
此外,onDestroy()不是析构函数。它并不会真正销毁对象。它只是基于某种状态调用的方法。因此,在超类的onDestroy()运行并返回后,您的实例仍然存在且非常健康。Android会保留进程,以防用户想要重新启动应用程序,这使得启动阶段更快。如果进程不做任何事情,并且需要回收内存,则会杀死该进程。
因此,在您的类中创建Toast对象,并在onDestroy()方法中调用cancel()
Class YourClassActivity extends Activity{

      private static Toast toast;

public void initToast(){
    if (toast != null)
        toast.cancel();
    toast =  Toast.makeText(MainActivity.this,"text",Toast.LENGTH_SHORT);
    toast.setText("Enter correct goal!");
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.show();
}

@Override
public void onDestroy() {
      super.onDestroy();
      if (toast != null)
        toast.cancel();
}
@Override
protected void onStop(){
    super.onStop();
    if (toast != null)
        toast.cancel();
}
}

在您的Button点击事件中调用initToast()方法。


1

Toast是与其上下文无关的。

你可以使用替代方案(AppMsg、Crouton或新的SnackBar),或者在Activity.onPause()中保留对Toast的引用并cancel()它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接