写这篇文章算是一个总结吧,总结一些使用Toast过程中出现的问题。
Toast弹框的优点在于使用起来方便,但是使用的时候还是有些细节需要注意。
1.自定义Toast
需求:需要展示一个有样式的提示弹框。那么有人就会问,用Dialog来做不行吗?用Dialog来做也行,但是一般的情况下Dialog无法再展示的情况下去点击Activity触发事件,所以这种情况下最简单的做法就是自定义
Toastpublic class MyTipsToast { public void show(Context context, String message){ final Toast toast = new Toast(context.getApplicationContext());
View contentView = LayoutInflater.from(context).inflate(R.layout.test,null);
TextView textView = contentView.findViewById(R.id.tv); if (!StringUtils.isEmpty(message)){
textView.setText(message);
toast.setView(contentView);
toast.setDuration(Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP,0,36);
toast.show();
}
}
}
最后,建议在自定义toast中不要做事件,提示框仅仅为了显示信息,如果想要处理事件,使用对话框更合适。
2.多个Toast快速显示的BUG
在展示Toast比较多的情况下基本都会遇到一个问题,关于这个问题,当然不同的机型会出现不同的结果。
比如一些手机,在快速点击弹出Toast的时候,下一条弹出时,会强制关闭上一条,这样当然是没有任何问题的,但是有些手机,下一条会等上一条消失后再弹出,这样时间就会累计起来,弹出多的情况会导致用户觉得Toast一直不消失,而且还没有办法交互性的让它消失。针对这种机型的Toast,我们需要做适配。
当然这种适配方案网上也有挺多,这里就不写出来了,百度一大堆,但是我在试的时候,感觉效果不是很好,所以我自己写了一种适配方案。
public class ToastUtils { private static Context mContext; private static List toastList; public static void init(Context context){
mContext = context;
toastList = new ArrayList<>();
} public static void show(String str){ if (mContext == null){ return;
}
Toast toast = Toast.makeText(mContext, str, Toast.LENGTH_SHORT);
toastList.add(toast); if (toastList.size() > 1){
Toast toast1 = toastList.get(0);
toastList.remove(0);
toast1.cancel();
toast1 = null;
}
toast.show();
}
}
比较投机取巧的方法,用List保存当前正在显示的Toast,当下个Toast展示的时候,先cancel掉前一个。只不过这样写可能会有个不好的地方是,点得快的时候,会一直替换内容,太快可能会导致用户没看清之前显示的内容是什么。但是这个也好解决,你可以在show的时候加一个延时操作,我这里就不演示了。
作者:键盘上的麒麟臂