为何调用setText()传入整数时程序崩溃?Button与TextView表现差异问询
哈哈,这个坑我刚学Android的时候也踩过!其实问题出在setText()方法的重载逻辑上,跟Button还是TextView本身没关系,咱们一步步说清楚:
核心原因:setText()的两个重载方法完全不同
Android的TextView(包括继承它的Button)有两个常用的setText()重载:
setText(CharSequence text):这才是用来显示文本内容的方法,不管你传String还是其他CharSequence子类,都会直接把内容显示在控件上。你用Integer.toString(answers.get(0))把整数转成字符串后,调用的就是这个版本,所以运行正常。setText(int resId):这个方法的参数是字符串资源的ID(比如R.string.submit这种系统或你自己定义的资源ID),而不是你要显示的整数数值。当你直接传answers.get(0)这个整数时,系统会去APP的资源文件里找对应ID的字符串,如果找不到(99%的情况都是这样,因为普通整数不会对应合法的资源ID),就会抛出Resources$NotFoundException,直接导致APP崩溃。
关于“TextView可以直接传整数”的误会
你觉得TextView能直接传整数显示,其实是个错觉:
- 如果你传的整数刚好是某个字符串资源的ID(比如
textView.setText(R.string.app_name)),那确实能显示对应的文本; - 但如果传的是普通数值(比如
textView.setText(123)),一样会崩溃,跟Button的情况完全一样。
正确的解决方式
必须把整数转换成字符串后再传给setText(),常用的几种写法:
- 用
Integer.toString()转换:button0.setText(Integer.toString(answers.get(0))); - 用
String.valueOf()转换:button0.setText(String.valueOf(answers.get(0))); - 如果需要格式化(比如补零、加单位),可以用
String.format():button0.setText(String.format("%d分", answers.get(0)));
内容的提问来源于stack exchange,提问作者Vivank
相关产品推荐
相关产品推荐

