Toast是Android中最常见的反馈机制,和Dialog不一样的是,它没有焦点,只能做简单的提示.虽然Google为我们提供了功能更强大的SnackBar,但是如果你无法说服你的产品经理接受它,那还是老老实实使用Toast.
关于Toast的源码就不看了,其实就是直接往window上面直接添加了一个View.不过Toast在使用的时候,还是存在一些问题:
- 如果连续产生了多个Toast,那么你会发现它会一个接一个的慢慢显示,要很久才能消失.这是因为Toast都在一个队列里面,只有上一个消失了,下一个才能显示,显然这样的体验不太友好.
为了避免上面的问题,我们需要提供一个方法,创建单例的Toast.这里为了方便,我直接继承了Toast,代码不多,就直接贴出来了:
public class SuperToast extends Toast {
private TextView message;
private ImageView image;
private SuperToast(Context context) {
super(context);
setDuration(Toast.LENGTH_SHORT);
}
volatile static SuperToast toast;
public synchronized static SuperToast init() {
if (toast == null) {
synchronized (SuperToast.class) {
if (toast == null) {
toast = new SuperToast(App.getContext());
}
}
}
return toast;
}
public SuperToast duration(int duration) {
super.setDuration(duration);
return this;
}
public void textNormal(CharSequence s){
text(s,0);
}
public void textSuccess(CharSequence s){
text(s,1);
}
public void textError(CharSequence s){
text(s,2);
}
private void text(CharSequence s, int type){
if(getView() == null){
View v = View.inflate(App.getContext(),R.layout.default_toast, null);
image = (ImageView) v.findViewById(R.id.image);
message = (TextView)v.findViewById(R.id.message);
setView(v);
}
if(type == 0 && image.getVisibility() != View.GONE){
image.setVisibility(View.GONE);
}else if(type == 1){
if(image.getVisibility() != View.VISIBLE){
image.setVisibility(View.VISIBLE);
}
image.setImageResource(android.R.drawable.stat_notify_chat);
}else if(type == 2){
if(image.getVisibility() != View.VISIBLE){
image.setVisibility(View.VISIBLE);
}
image.setImageResource(android.R.drawable.stat_notify_error);
}
message.setText(s);
show();
}
}
代码很简单,没什么需要解释的地方. 需要注意的是,为免单例模式引起内存泄漏,这里的Context使用的是Application.前面说过,toast是直接添加到window上面的,不依赖于Activity,所以使用Application构建是没有问题的.
这样我们就可以通过以下的方式使用了
SuperToast.init().textNormal("a");
SuperToast.init().textSuccess("呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵");
SuperToast.init().textError("addafhsdhshashsdhsgahshsh");
效果如下
S61017-155757.jpg
网友评论