更改Toast显示机制

在Android中,Toast是十分常用的,用于显示一些小提示。但是,Toast的显示机制有一点点的小问题。例如,点击一个按钮,显示一下Toast,持续2秒钟,如果不断的按这个按钮,那Toast就会按照顺序,前一个消失后才接着显示下一个。所以如果连接按5次按钮,那么有5个Toast显示,总共持续10秒钟。虽然这个例子是按钮处理事件不恰当,但同时也说明了Andriod中Toast的显示机制不够好。

那么Toast如何展示比较恰当呢?当要显示一个Toast B时,如果当前已经有一个Toast A还没有消失,那么这个Toast A应该立即消失,并立即显示Toast B。其实要实现这个显示机制,也十分简单。只需要让全局只有一个Toast实例即可。

1
2
3
4
5
6
7
8
9
10
private Toast mToast;
public void showToast(String text) {
if(mToast == null) {
mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
} else {
mToast.setText(text);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}

再说说另一种更常见的情况——再按一次返回键退出应用,问题就是应用程序已经退出了,但是Toast还会停留一下才消失(因为还没过设置好的持续时间)。解决这个问题的方法也十分简单。只需要在退出时cancel这个全局Toast即可。

1
2
3
4
5
6
7
8
9
10
public void cancelToast() {  
if (mToast != null) {
mToast.cancel();
}
}

public void onBackPressed() {
cancelToast();
super.onBackPressed();
}

反正Toast是经常用的,而且Android自带的样式也不太好看,建议继承Toast自定义一个Toast,并且使用以上机制,使整个应用只有一个Toast实例。“使整个应用只有一个Toast实例”就是设计模式中的单例模式的一个活生生的例子了!