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的方式实现自己想要的效果