最近使用自己封装的Toast时,遇到一个问题
java.lang.RuntimeException: This Toast was not created with Toast.makeText()
刚开始追踪原因以为Toast初始化是空的,按照这个思路去改,发现还是出现这个崩溃。so,查资料。
因为产品有吐司图片的需求,所以封装了以下两个方法:文字吐司+图片吐司。
1 public class ToastUtils { 2 3 private static Toast mToast; 4 5 public static void showToast(Context context, String msg){ 6 if(null == mToast){ 7 mToast = new Toast(context); 8 } 9 mToast.setDuration(Toast.LENGTH_SHORT); 10 mToast.setText(msg); 11 mToast.show(); 12 } 13 14 public static void showToastWithImg(Context context, View view){ 15 if(null == mToast){ 16 mToast = new Toast(context); 17 } 18 mToast.setDuration(Toast.LENGTH_SHORT); 19 mToast.setView(view); 20 mToast.show(); 21 } 22 }
乍一看,貌似没啥问题。但是如果先调用showToastWithImg()之后,再调用showToast(),这个崩溃必现。
那是因为:
1、这是因为先执行showToastWithImg()方法时,mToast.setView(view);把Toast中的contentView替换为自定义的view了;
2、而再执行showToast()方法之后,mToast对象不为空,复用了前面的对象;
3、mToast.setText(msg):这句代码是给指定的TextView设置msg文本,而这个指定的TextView在默认的contentView中,但是这个contentView已经修改为自定义的view了,里面已经没有指定的那个TextView了。
所以解决方案是设置两个不同的Toast对象
private static Toast mTextToast = null; private static Toast mViewToast = null;
文字和图片的吐司分开去复用,这样就解决啦!
By LiYing