This Toast was not created with Toast.makeText()

出现这个问题的背景是我要创建一个自定义的Toast,代码如下:

binding.button.setOnClickListener {
            val result = binding.button.text
            toast01 = Toast(this)
            toast01.setGravity(Gravity.CENTER,0,0)
            toast01.setText("$result")
            toast01.show()

        }

跟踪一下Toast的源码发现,出现这个错误提示是在调用setText方法的时候,进入到settext方法中看一下它的执行逻辑:

public void setText(CharSequence s) {
        if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {
            if (mNextView != null) {
                throw new IllegalStateException(
                        "Text provided for custom toast, remove previous setView() calls if you "
                                + "want a text toast instead.");
            }
            mText = s;
        } else {
            if (mNextView == null) {
                throw new RuntimeException("This Toast was not created with Toast.makeText()");
            }
            TextView tv = 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);
        }
    }

可以看到,This Toast was not created with Toast.makeText()这个错误出现在两个地方,一个是mNextView为null的时候,一个是tv为null的时候,因为tv对象是通过mNextView获取的,所以我们只关注mNextView为null的时候就可以了。这时候我们可以在源码中搜索一下mNextView是在什么时候赋值的,通过搜索可以观察到给mNextView赋值的地方主要有两个方法,setView(View view)方法和makeText方法。而setView方法在源码中已经标注为废弃并且官方也建议使用makeText替代setView,所以我们直接看一下makeText方法内部是如何处理的。

public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
            @NonNull CharSequence text, @Duration int duration) {
        if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {
            Toast result = new Toast(context, looper);
            result.mText = text;
            result.mDuration = duration;
            return result;
        } else {
            Toast result = new Toast(context, looper);
            View v = ToastPresenter.getTextToastView(context, text);
            result.mNextView = v;
            result.mDuration = duration;

            return result;
        }

可以看到,在makeTextf方法中会生成一个Toast对象,然后将mNextView初始化并且赋值为一个View对象,最后再将这个Toast对象返回。其实我们在刚开始的自定义Toast的代码中创建了一个Toast对象,但是我们直接创建的Toast的对象并没有对mNextView进行赋值,所以mNextView依然是空的。

上面就是针对自定义Toast过程中出现的This Toast was not created with Toast.makeText()问题的简单分析,而解决这个问题的方法也非常简单,因为makeText方法本身就返回一个Toast对象,所以只需要把自定义过程中的Toast(this)替换成makeText即可。

binding.button.setOnClickListener {
            val result = binding.button.text
            toast01 = Toast.makeText(this,"$result",Toast.LENGTH_LONG)
            toast01.setGravity(Gravity.CENTER,0,0)
            toast01.setText("$result")
            toast01.show()

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值