This Toast was not created with Toast.makeText()

这个错误遇到两次了,这里记录一下

错误:

java.lang.RuntimeException: This Toast was not created with Toast.makeText()

分析

这个错误,是我在使用封装好的Toast工具类时出现的,工具类代码大概如下:

public class ToastUtils {

    private static Toast mToast;

    public static void showToast(Context context, String msg){
        if(null == mToast){
            mToast = new Toast(context);
        }
        mToast.setDuration(Toast.LENGTH_SHORT);
        mToast.setText(msg);
        mToast.show();
    }

    public static void showToast(Context context, View view){
        if(null == mToast){
            mToast = new Toast(context);
        }
        mToast.setDuration(Toast.LENGTH_SHORT);
        mToast.setView(view);
        mToast.show();
    }
}

重现步骤:

  1. 先调用 showToast(Context context, View view)
  2. 在调用showToast(Context context, String msg)

原因:

1.先执行showToast(Context context, View view)方法,会调用Toast的这个方法

public void setView(View view) {
        mNextView = view;
    }

这时候mNextView是我们自定义的view

2、再执行showToast(Context context, String msg)方法,这时候的mToast不为空,所以不会重新创建,会执行mToast.setText(msg)代码如下

public void setText(CharSequence s) {
        if (mNextView == null) {
            throw new RuntimeException("This Toast was not created with Toast.makeText()");
        }
        TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);
        if (tv == null) {
            throw new RuntimeException("This Toast was not created with Toast.makeText()");
        }
        tv.setText(s);
    }

此时的mNextView 是在调用上一个函数时传入的自定义的view,在获取tv的时候,就有可能返回空值。

因此会报上面的错误

解决方法:

可以创建两个Toast这样它们就互不影响了

public class ToastUtils {

    private static Toast mTextToast;
    private static Toast mViewToast;

    public static void showToast(Context context, String msg){
        if(null == mTextToast){
            mTextToast = new Toast(context);
        }
        mTextToast.setDuration(Toast.LENGTH_SHORT);
        mTextToast.setText(msg);
        mTextToast.show();
    }

    public static void showToast(Context context, View view){
        if(null == mViewToast){
            mViewToast = new Toast(context);
        }
        mViewToast.setDuration(Toast.LENGTH_SHORT);
        mViewToast.setView(view);
        mViewToast.show();
    }
}

反省:

遇到很多的问题,很多是因为使用了网上一些库,或者代码,其中存在一些隐藏较深的问题,但不知道为何还挺流行的。(可能是因为出现的比较早吧)

像徐医生那个扫描二维码 ,对YUV图像的旋转,是错误的。只不过能用而已,但是效率肯定差很多。至今我看到的几乎所有的项目,都保持着那个错误。(我在这篇文章中的源码,进行了修改)

希望这些贡献库或者代码的人,能更加的认真负责一些。

参考:This Toast was not created with Toast.makeText()

相关文章
相关标签/搜索