单击按钮时,我正在显示一个简单的Toast。我的问题是,当我多次点击一个按钮时,Toast消息会一直显示,直到我进入主屏幕。当我到达主屏幕并在相应的活动中杀死Toast消息时,我想停止Toast。我附上了截图。
我编写的代码如下:
public class Main extends Activity {
Dialog d;
Toast t;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
t = Toast.makeText(Main.this, "you clicked on button!", Toast.LENGTH_LONG);
t.show();
}
});
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
t.cancel();
}
}
我该怎么做?
答案 0 :(得分:7)
嗨,我有同样的问题。问题是Toast重叠,例如如果按10次Toast将保持10 x LENGTH_SHORT。我带来的唯一解决方案是控制Toast由我自己显示的时间。当您显示Toast时,只需跟踪上次显示它,它仍然在屏幕上不再显示它。在最糟糕的情况下,Toast仅在LENGTH_SHORT时间可见。
答案 1 :(得分:6)
Toast.makeText
返回Toast对象。您可以在此对象上调用cancel()
取消它,然后显示新对象。
答案 2 :(得分:1)
这个简单的解决方案对我来说非常合适,一个取消任何当前显示的祝酒词的单身人士:
public enum SingleToast {
INSTANCE;
private Toast currentToast;
private String currentMessage;
public void show(Context context, String message, int duration) {
if (message.equals(currentMessage)) {
currentToast.cancel();
}
currentToast = Toast.makeText(context, message, duration);
currentToast.show();
currentMessage = message;
}
}
如果您想要取消任何Toast(即使消息不同),您可以省略整个 currentMessage 部分并包含 currentToast!= null 作为取消的检查。
第一种方法的缺点是,当你开始2个不同的祝酒词(#1&#2)时,当你开始#1时你不能再取消它们:这是因为单身人士保存了# 2作为当前的'即使它还没有显示。所以当你再次开始#1时,它仍会被添加到2个Toasts的队列中:#1,#2,#1,所有这些都将被显示。
因此,选择适合您用途的2种解决方案中的任何一种,或者使用计时器扩展这个简单的单例,猜测Mojo建议的是什么。
调用toast很简单:我用它来显示一些自定义异常的消息:
public abstract class CustomToastException extends Exception {
public CustomToastException(String message) {
super(message);
SingleToast.INSTANCE.show(context, getMessage(), Toast.LENGTH_LONG);
}
}
注意,如果有人想知道: 我提出了一个新问题,我的解决方案是否不会造成任何麻烦: Static context saved in Application class and used in a singleton toast builder, does this create a memory leak?