当我点击按钮时,我正在显示一个简单的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();
}
}
我该怎么做?
嗨,我有同样的问题。问题是Toast重叠,例如如果按10次Toast将保持10 x LENGTH_SHORT。我带来的唯一解决方案是控制Toast由我自己显示的时间。当您显示Toast时,只需跟踪上次显示它,它仍然在屏幕上不再显示它。在最糟糕的情况下,Toast仅在LENGTH_SHORT时间可见。
Toast.makeText
返回Toast对象。您可以在此对象上调用cancel()
以取消它,然后显示新对象。
这个简单的解决方案非常适合我,一个取消任何当前显示的祝酒词的单身人士:
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,并且所有将显示。
因此,选择适合您用途的这两种解决方案中的任何一种,或者使用计时器扩展这个简单的单例,猜测这就是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?