Toast的简单封装

作者: 四月一号 | 来源:发表于2016-10-18 21:26 被阅读412次

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

代码在这里

相关文章

  • Toast的简单封装

    Toast是Android中最常见的反馈机制,和Dialog不一样的是,它没有焦点,只能做简单的提示.虽然Goog...

  • Android开发-Toast

    Toast Toast是一个消息提示组件 设置显示的位置 自定义显示内容(添加一个图片) 简单封装 ToastAc...

  • 封装一个多彩的Toast

    由于Toast封装的比较完善,我们很难对Toast的样式进行更改,甚至简单的字体颜色和大小都不能直接更改,只能自定...

  • Android 之路 (6) - 关于Toast和Log的封装

    引言 上篇完成了对Dialog的简单封装,本篇将对Android开发中另外两个常用工具类的封装:T(Toast)和...

  • 封装 Toast

    Toast 是一个弹出的通知,用法很简单,代码如下: 第一个参数是上下文,第二个参数是具体的通知内容,第三个参数是...

  • Android 简单封装Toast工具类

    今天在此分享一个之前自己封装的Toast工具类。作为一个提示类的组件,系统有些方面做得并不是特别好,比如多次点击会...

  • Jetpack 全局控制 实战自定义Toast

    自定义Toast 控制Toast 的位置 利用LiveData 观察者模式,封装到BaseActivity观察。L...

  • Toast封装(2018.10.15)

    1. ToastUtil类 2. 调用 ToastUtil.show(activity,activity.getS...

  • Android Toast封装

  • 封装toast插件

    toast.vue toast.js **全局调用$toast方法就是触发了绑定在Vue原型上的showToast...

网友评论

    本文标题:Toast的简单封装

    本文链接:https://www.haomeiwen.com/subject/urmayttx.html