Android中我们常用的提示功能就是Toast了,最近使用Toast的时候出现了一些不可预料的错误,分析才发现是由Toast实例太多引起导致,所以基于系统Toast封装了带图片和文字Toast,并且永远只有一个Toast实例,大大减少了内存开销。
实现思路:
1,关于如何实现只带文字显示,事先判断当前Toast是否存在,如果不存在我们才获取Toast实例,如果存在就直接设置text,实现如下:
if (mToast == null) { mToast = Toast.makeText(mContext, content, Toast.LENGTH_SHORT); } else { mToast.setText(content); }
2,关于如何实现带图片和文字显示,原理和文字显示差不多,也是先判断当前要得到的Toast是否存在,如果存在就直接设置相关图片和文字,实现如下:
if (mToast == null) { mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT); } else { mToast.setText(text); } LinearLayout view = (LinearLayout) mToast.getView(); if (mIv == null) { mIv = new ImageView(mContext); } mIv.setImageResource(resImag); if (view.getChildCount() != 1) { view.removeViewAt(1); } view.addView(mIv);
其中如果不加view.getChildCount()!=1这个判断,当我们点击的时候上一次设置的图片依然会弹出来,就是图片会一直追加,所以增加了这样一个判断,每次设置图片的时候,如果存在图片就先移除再add图片。
完整代码如下:
/** * 吐司工具类 * Created by STRUGGLE on 2018/4/27. */ public class ToastUtil { private static Context mContext; private static ImageView mIv; private static Toast mToast; /** * 只显示文字吐司 * * @param mContext */ public static void setContext(Context mContext) { ToastUtil.mContext = mContext; } public static void show(String content) { if (mToast == null) { mToast = Toast.makeText(mContext, content, Toast.LENGTH_SHORT); } else { mToast.setText(content); } mToast.setGravity(Gravity.CENTER, 0, 0); mToast.show(); } /** * 显示带图片文字的吐司 * * @param text * @param resImag */ public static void show(String text, int resImag) { if (mToast == null) { mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT); } else { mToast.setText(text); } LinearLayout view = (LinearLayout) mToast.getView(); if (mIv == null) { mIv = new ImageView(mContext); } mIv.setImageResource(resImag); if (view.getChildCount() != 1) { view.removeViewAt(1); } view.addView(mIv); mToast.show(); } }
这样封装后,无论调用多少次Toast,就只会存在一个Toast实例,大大减少了内存开销。