TextView.setText() & Resources$NotFoundException

xiaoxiao2021-02-28  6

在我们的日常开发中,TextView算得上是最最常用的一个控件。

今天我们要谈论的不是TextView的使用方法,而是记录一个我在开发中遇到的一个小坑。

在开发中我们要给TextView设置文字的时候,我们会调用setText()方法,通常我们会把String或者String资源作为参数传入进去。

 

或者像这样

 

这不能在简单了,那我们今天要讨论的是什么问题呢?

问题描述

在开发中,我们的开发流程一般都是这样的:我们需要调用服务器的接口,获取到返回的数据,然后把数据显示在界面上。现在假设,如果后台返回的数据格式中有Integer类型的,那么我们在定义数据类型的时候,如果定义成数值型的,假设是int类型的,那么这个时候我们需要用TextView来显示这个值,应该怎么做?

之前在开发的时候,是有过直接把值传入setText()中的,嗯,没错。

 

就像图上这样,是的,你看编译器都没报错。那我们运行一下看看。

 

字太小了,我放大一下:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chrissen.myapplication/com.chrissen.myapplication.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x1.lang.RuntimeException: Unable to start activity ComponentInfo{com.chrissen.myapplication/com.chrissen.myapplication.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x1

报的错是:Resources$NotFoundException,资源找不到;

由于上面的Demo代码量比较小,所以很容易定位出问题的出处,显然是setText()时传入的值有问题。那如果代码量很大呢,那找起来可就不容易了。

分析问题

为什么在编译的时候会出错但传值的时候没有报错呢?根据刚开始的提示,你应该明白了吧。原因是setText()时候是可以传入int类型的。

 

这是setText(int resid)源码,报错的原因是因为我们传入的Int值并不是用@ResourceRes注解的,这个注解的意思是资源类型文件。而我们传入的mValue值根本不是一个资源Id,所以在运行的时候是找不到对应的资源文件的,所以就会报错了。

解决方法

在写对应的Bean文件的时候把int型的都定义成String类型的;

setText()时用String.valueOf()进行类型转换

写在最后

这篇文章并没有什么高深的地方,只是自己在开发中遇到的一个小坑而已,希望你在以后的开发中能够避免在踩。

转载请注明原文地址: https://www.6miu.com/read-2350264.html

最新回复(0)