原创作品,转载请注明出处
Toast在Android开发中可以说是非常常见的,但是正常的写法会有一长串,一两次还好,写的多了不免有些腻,那么面对常规的使用情况,我选择分装一个Util类——ToastUtil.
需求分析
- 显示的位置
不同的场景下,我们会想让Toast显示在不同的位置:
1. Gravity.TOP
2. Gravity.CENTER
3. Gravity.BOTTOM
- 显示的时间
同理,我们也会考虑到显示的时间长短
1. Toast.LENGTH_SHORT
2. Toast.LENGTH_LONG
- 复用的问题
如果说在某些情况下需要多次不同的提示,怎么办?
- 可以手动取消Toast
提供一个取消的方法,让Toast的显示更灵活
构建方法
直接开撸,根据时间和位置可组合6种情况
1. showShortTop()——短时间居上显示
2. showShortCenter()——短时间居中显示
3. showShortBottom()——短时间居下显示
4. showLongTop()——长时间居上显示
5. showLongCenter()——长时间居中显示
6. showLongBottom()——长时间居下显示
解决复用
我们保证在Util里只出现一个Toast——mToast
提供手动取消的方法
cancelToast()
具体实现
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
……
}
上面的方法是Toast是实际实现放发,入参是Context,CharSequence(显示的类容),Duration(显示的时长)
所以上面的6个showXXX()方法的参数已经知道了,实现如下:
/**
* 居上显示 短时间
* @param msg 显示类容
*/
public static void showShortTop(Context context,Object msg){
show(context,msg,Gravity.TOP,Toast.LENGTH_SHORT);
}
/**
* 居中显示 短时间
* @param msg 显示类容
*/
public static void showShortCenter(Context context,Object msg){
show(context,msg,Gravity.CENTER,Toast.LENGTH_SHORT);
}
/**
* 居下显示 短时间
* @param msg 显示类容
*/
public static void showShortBottom(Context context,Object msg){
show(context,msg,Gravity.BOTTOM,Toast.LENGTH_SHORT);
}
/**
* 居上显示 长时间
* @param msg 显示类容
*/
public static void showLongTop(Context context,Object msg){
show(context,msg,Gravity.TOP,Toast.LENGTH_LONG);
}
/**
* 居中显示 长时间
* @param msg 显示类容
*/
public static void showLongCenter(Context context,Object msg){
show(context,msg,Gravity.CENTER,Toast.LENGTH_LONG);
}
/**
* 居下显示 长时间
* @param msg 显示类容
*/
public static void showLongBottom(Context context,Object msg){
show(context,msg,Gravity.BOTTOM,Toast.LENGTH_LONG);
}
注意到没有,它们都调用了show(),具体的实现就在这个里面了
/**
* 显示 不对外开放
* @param msg 显示类容
* @param gravity 显示位置
*/
private static void show(Context context, Object msg, int gravity, int duration){
//这里是我把msg设置成Object的原因,方便直接传入文字或者资源id,你也可以进行细化或扩展
String showmsg = "" ;
if (msg instanceof Integer){
showmsg = context.getString((Integer) msg);
}else if (msg instanceof String){
showmsg = (String) msg;
}
if (mToast == null){
//如果Toast不存在则创建
mToast = Toast.makeText(context, showmsg , duration);
}else {
//如果当前Toast没有消失, 直接显示内容,不需要重新设置
mToast.setText(showmsg);
}
mToast.setGravity(gravity,0,100);//设置位置只有在初次创建的时候有效
mToast.show();
}
我们的Util中始终只有一个Toast对象,所以取消的时候只需要这样
/**
* 取消toast
*/
public static void cancelToast(){
if (mToast != null) {
mToast.cancel();
mToast = null;
}
}
好了本篇内容先说到这里,简单的实用小封装,如果觉得哪里不对或需要改进,欢迎留言一起讨论
每星期至少一篇跟新本系列,感兴趣可以关注。
一起学习,一起进步。