Toast的简单封装

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

代码在这里

推荐阅读更多精彩内容