Android实用的Toast工具类封装

 Toast这个提示框大家都晓得,显示一段时间后自动消失,不能获得焦点。但是在使用中有些问题:

1)需要弹出一个新的Toast时,上一个Toast还没有显示完
2)可能重复弹出相同的信息
3)Toast具体有哪些用法不是很熟悉,用到时导出去找
4)app退出去了,Toast还在弹
等等一系列问题
下面封装了一个工具类,帮助大家管理Toast,基本上可以满足常用的需求,如果还满足不了,那就自定义了

  1 import android.content.Context;
  2 import android.view.View;
  3 import android.widget.ImageView;
  4 import android.widget.LinearLayout;
  5 import android.widget.Toast;
  6   
  7 /**
  8  * Created by wangwentao on 2017/1/25.
  9  * Toast统一管理类
 10  */
 11   
 12 public class ToastUtil {
 13  private static boolean isShow = true;//默认显示
 14  private static Toast mToast = null;//全局唯一的Toast
 15   
 16 /**
 17  *private控制不应该被实例化*/
 18  private ToastUtil() {
 19   throw new UnsupportedOperationException("不能被实例化");
 20  }
 21   
 22  /**
 23   * 全局控制是否显示Toast
 24   * @param isShowToast
 25   */
 26  public static void controlShow(boolean isShowToast){
 27   isShow = isShowToast;
 28  }
 29   
 30  /**
 31   * 取消Toast显示
 32   */
 33  public void cancelToast() {
 34   if(isShow && mToast != null){
 35    mToast.cancel();
 36   }
 37  }
 38   
 39  /**
 40   * 短时间显示Toast
 41   *
 42   * @param context
 43   * @param message
 44   */
 45  public static void showShort(Context context, CharSequence message) {
 46   if (isShow){
 47    if (mToast == null) {
 48     mToast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
 49    } else {
 50     mToast.setText(message);
 51    }
 52    mToast.show();
 53   }
 54  }
 55   
 56  /**
 57   * 短时间显示Toast
 58   *
 59   * @param context
 60   * @param resId 资源ID:getResources().getString(R.string.xxxxxx);
 61   */
 62  public static void showShort(Context context, int resId) {
 63   if (isShow){
 64    if (mToast == null) {
 65     mToast = Toast.makeText(context, resId, Toast.LENGTH_SHORT);
 66    } else {
 67     mToast.setText(resId);
 68    }
 69    mToast.show();
 70   }
 71  }
 72   
 73  /**
 74   * 长时间显示Toast
 75   *
 76   * @param context
 77   * @param message
 78   */
 79  public static void showLong(Context context, CharSequence message) {
 80   if (isShow){
 81    if (mToast == null) {
 82     mToast = Toast.makeText(context, message, Toast.LENGTH_LONG);
 83    } else {
 84     mToast.setText(message);
 85    }
 86    mToast.show();
 87   }
 88  }
 89   
 90  /**
 91   * 长时间显示Toast
 92   *
 93   * @param context
 94   * @param resId 资源ID:getResources().getString(R.string.xxxxxx);
 95   */
 96  public static void showLong(Context context, int resId) {
 97   if (isShow){
 98    if (mToast == null) {
 99     mToast = Toast.makeText(context, resId, Toast.LENGTH_LONG);
100    } else {
101     mToast.setText(resId);
102    }
103    mToast.show();
104   }
105  }
106   
107  /**
108   * 自定义显示Toast时间
109   *
110   * @param context
111   * @param message
112   * @param duration 单位:毫秒
113   */
114  public static void show(Context context, CharSequence message, int duration) {
115   if (isShow){
116    if (mToast == null) {
117     mToast = Toast.makeText(context, message, duration);
118    } else {
119     mToast.setText(message);
120    }
121    mToast.show();
122   }
123  }
124   
125  /**
126   * 自定义显示Toast时间
127   *
128   * @param context
129   * @param resId 资源ID:getResources().getString(R.string.xxxxxx);
130   * @param duration 单位:毫秒
131   */
132  public static void show(Context context, int resId, int duration) {
133   if (isShow){
134    if (mToast == null) {
135     mToast = Toast.makeText(context, resId, duration);
136    } else {
137     mToast.setText(resId);
138    }
139    mToast.show();
140   }
141  }
142   
143  /**
144   * 自定义Toast的View
145   * @param context
146   * @param message
147   * @param duration 单位:毫秒
148   * @param view 显示自己的View
149   */
150  public static void customToastView(Context context, CharSequence message, int duration,View view) {
151   if (isShow){
152    if (mToast == null) {
153     mToast = Toast.makeText(context, message, duration);
154    } else {
155     mToast.setText(message);
156    }
157    if(view != null){
158     mToast.setView(view);
159    }
160    mToast.show();
161   }
162  }
163   
164  /**
165   * 自定义Toast的位置
166   * @param context
167   * @param message
168   * @param duration 单位:毫秒
169   * @param gravity
170   * @param xOffset
171   * @param yOffset
172   */
173  public static void customToastGravity(Context context, CharSequence message, int duration,int gravity, int xOffset, int yOffset) {
174   if (isShow){
175    if (mToast == null) {
176     mToast = Toast.makeText(context, message, duration);
177    } else {
178     mToast.setText(message);
179    }
180    mToast.setGravity(gravity, xOffset, yOffset);
181    mToast.show();
182   }
183  }
184   
185  /**
186   * 自定义带图片和文字的Toast,最终的效果就是上面是图片,下面是文字
187   * @param context
188   * @param message
189   * @param iconResId 图片的资源id,如:R.drawable.icon
190   * @param duration
191   * @param gravity
192   * @param xOffset
193   * @param yOffset
194   */
195  public static void showToastWithImageAndText(Context context, CharSequence message, int iconResId,int duration,int gravity, int xOffset, int yOffset) {
196   if (isShow){
197    if (mToast == null) {
198     mToast = Toast.makeText(context, message, duration);
199    } else {
200     mToast.setText(message);
201    }
202    mToast.setGravity(gravity, xOffset, yOffset);
203    LinearLayout toastView = (LinearLayout) mToast.getView();
204    ImageView imageView = new ImageView(context);
205    imageView.setImageResource(iconResId);
206    toastView.addView(imageView, 0);
207    mToast.show();
208   }
209  }
210   
211  /**
212   * 自定义Toast,针对类型CharSequence
213   * @param context
214   * @param message
215   * @param duration
216   * @param view
217   * @param isGravity true,表示后面的三个布局参数生效,false,表示不生效
218   * @param gravity
219   * @param xOffset
220   * @param yOffset
221   * @param isMargin true,表示后面的两个参数生效,false,表示不生效
222   * @param horizontalMargin
223   * @param verticalMargin
224   */
225  public static void customToastAll(Context context, CharSequence message, int duration,View view, boolean isGravity,int gravity, int xOffset, int yOffset,boolean isMargin,float horizontalMargin, float verticalMargin) {
226   if (isShow){
227    if (mToast == null) {
228     mToast = Toast.makeText(context, message, duration);
229    } else {
230     mToast.setText(message);
231    }
232    if(view != null){
233     mToast.setView(view);
234    }
235    if(isMargin){
236     mToast.setMargin(horizontalMargin, verticalMargin);
237    }
238    if(isGravity){
239     mToast.setGravity(gravity, xOffset, yOffset);
240    }
241    mToast.show();
242   }
243  }
244   
245  /**
246   * 自定义Toast,针对类型resId
247   * @param context
248   * @param resId
249   * @param duration
250   * @param view :应该是一个布局,布局中包含了自己设置好的内容
251   * @param isGravity true,表示后面的三个布局参数生效,false,表示不生效
252   * @param gravity
253   * @param xOffset
254   * @param yOffset
255   * @param isMargin true,表示后面的两个参数生效,false,表示不生效
256   * @param horizontalMargin
257   * @param verticalMargin
258   */
259  public static void customToastAll(Context context, int resId, int duration,View view,boolean isGravity,int gravity, int xOffset, int yOffset,boolean isMargin,float horizontalMargin, float verticalMargin) {
260   if (isShow){
261    if (mToast == null) {
262     mToast = Toast.makeText(context, resId, duration);
263    } else {
264     mToast.setText(resId);
265    }
266    if(view != null){
267     mToast.setView(view);
268    }
269    if(isMargin){
270     mToast.setMargin(horizontalMargin, verticalMargin);
271    }
272    if(isGravity){
273     mToast.setGravity(gravity, xOffset, yOffset);
274    }
275    mToast.show();
276   }
277  }
278 }

 

1)Toast底层使用handler机制,分别post一个nShow和一个mHide来控制Toast显示还是隐藏

2)Toast的视图是通过WindowManager的addView来加载的

3)先通过makeText()实例化出一个Toast,然后调用toast.Show()方法,这时并不会马上显示Toast,而是会实例化一个TN变量,然后通过service.enqueueToast()将其加到服务队列里面去等待显示。在TN中进行调控Toast的显示格式以及里面的hide()、show()方法来控制Toast的出现以及消失,强调一下的是这个队列是系统维护的,我们并不能干涉。

4)我们常传的时间参数LONG_DELAY和SHORT_DELAY具体时间分别是:3.5秒和2秒

5)如果我们自己也想实现类似Toast效果怎么办?

可以使用windowManager添加view的方式实现自己想要的效果

Android实用的Toast工具类封装

上一篇:Android 10 终于来了!增加了不少新特性


下一篇:前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配