android中setText不能传int值

本文详细介绍了在Android开发过程中遇到的运行时找不到字符串ID的异常问题,通过分析代码并深入理解Android资源加载机制,找到了问题的根本原因。文中提供了解决方案,包括在使用setText()方法时正确转换数据类型,以及如何提前进行字符串的类型转换,避免了资源找不到的错误。同时,文章还分享了避免此类问题的一些建议和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常信息:Caused By: android.content.res.Resources$NotFoundException:String resource ID #0x86

相关代码是:

private TextView tv_height = null;
 

int height = bundle.getInt("myheight");
  

tv_height.setText(height);//注意要转型,不然报找不到String ID

问题原因:

显示是运行时找不到一个字符串导致的异常,最后费了半天劲,发现是因为在调用setText(String str)方法时,传的是一个int型数据,未对其转为String类型,可能是Android中未实行对它的自动转型,这里可以改为:  tv_height.setText(""+height);  解决此异常。 

或者提前进行转换,例如:

int n = Integer.parseInt("123");//将字符串转化成整形
String s = String.valueOf(int a );//将整形转化为字符串

<think>我们正在讨论的是Android中如何将String形式的资源名称(如控件ID的字符串名称或标题的字符串名称)转换为整数int)。根据之前的对话,用户已经了解如何直接使用R.id.xxx获取整数,以及如何将文本内容转换为整数。现在用户明确询问如何将字符串形式的资源ID(例如"title")转换为int。在Android中,资源ID(如布局文件中的android:id="@+id/title")在编译后会生成R.java文件,其中每个资源都有一个唯一的整数。如果我们有一个字符串表示的资源名称(如"title"),我们可以通过Resources类的getIdentifier()方法来获取对应的整数。具体步骤如下:1.获取Resources对象。2.调用getIdentifier()方法,入三个参数:-资源名称(字符串,例如"title")-资源类型(例如"id"、"string"等)-包名(通常是你应用的包名)例如,要获取id为"title"的控件ID的整数,可以这样写:intresId=context.getResources().getIdentifier("title","id",context.getPackageName());同样,如果要获取字符串资源(如标题字符串资源)的整数,假设我们有一个字符串资源名为"app_title",那么可以这样写:intstringResId=context.getResources().getIdentifier("app_title","string",context.getPackageName());注意:getIdentifier()方法在资源不存在时会返回0,因此在使用前应检查返回。另外,根据引用[1]中的内容,我们也可以看到在TextView的setText方法中可以直接入一个字符串资源ID(int),因此如果我们通过字符串名称获取到了这个int,就可以直接使用。但是,需要注意的是,直接使用R.id.xxx或R.string.xxx的效率要高于getIdentifier(),因为getIdentifier()是通过反射来查找资源的,所以应避免在性能敏感的地方使用。下面给出一个完整的示例代码:假设我们有一个字符串变量,存储了资源名称:StringidName="title";//控件ID的字符串名称StringstringResName="app_title";//字符串资源的名称在Activity中://获取控件ID的整数intviewId=getResources().getIdentifier(idName,"id",getPackageName());if(viewId!=0){//找到资源,可以使用viewIdTextViewtitleView=findViewById(viewId);}else{//资源未找到,处理错误}//获取字符串资源ID的整数intstringId=getResources().getIdentifier(stringResName,"string",getPackageName());if(stringId!=0){//设置文本,使用字符串资源textView.setText(stringId);//这里使用了引用[1]中的setText(int)方法}另外,用户还提到了“title”可能指的是标题(即字符串),但这里我们明确是资源名称的字符串。如果用户是指控件的文本内容(即已经显示在屏幕上的字符串)转换为整数,那应该使用Integer.parseInt(),但这种情况与资源ID无关。总结:-将字符串形式的资源名称转换为资源ID(int)使用getIdentifier()方法。-资源类型包括:"id"、"string"、"drawable"、"layout"等。注意:如果资源名称包含在多个配置中(例如不同dpi的drawable),getIdentifier()会返回任意一个匹配的资源ID(通常是默认的)。因此,最好确保资源名称的唯一性。相关问题:1.如何通过资源ID获取资源名称?2.在Android中如何动态加载资源?3.使用getIdentifier()有哪些性能问题?如何避免?</think>### Android 中字符串形式的资源名称转整数int) 在 Android 中,将**字符串形式的资源名称**(如 `"title"`)转换为对应的整数int),需要使用 `Resources.getIdentifier()` 方法。以下是具体实现方式: #### 核心方法 ```java // 获取资源标识符的整数 int resId = getResources().getIdentifier( "title", // 资源名称字符串 "id", // 资源类型(id/string/drawable等) getPackageName() // 应用包名 ); ``` #### 完整使用示例 ```java // 1. 获取控件ID的整数(如 android:id/title) String viewIdName = "title"; // 资源名称 int viewIdInt = getResources().getIdentifier(viewIdName, "id", getPackageName()); // 使用ID查找控件 if (viewIdInt != 0) { // 返回0表示未找到 View targetView = findViewById(viewIdInt); } // 2. 获取字符串资源的整数(如 R.string.title) String stringResName = "app_name"; // 字符串资源名 int stringResId = getResources().getIdentifier(stringResName, "string", getPackageName()); // 使用资源ID设置文本 if (stringResId != 0) { textView.setText(stringResId); // 直接使用int资源ID[^1] } ``` #### 关键说明 1. **返回含义**: - 成功:返回资源ID的整数(如 `2131165328`) - 失败:返回 `0`(资源不存在) 2. **资源类型参数**: ```java // 常用资源类型 "id" // 控件ID (R.id) "string" // 字符串资源 (R.string) "drawable" // 图片资源 (R.drawable) "layout" // 布局文件 (R.layout) ``` 3. **性能注意**: - 避免在循环中频繁调用 `getIdentifier()`,因其通过反射查询资源表 - 建议在初始化阶段预加载资源ID[^2] #### 常见错误处理 当转换失败时(返回0),需检查: 1. 资源名称是否拼写正确(区分大小写) 2. 资源类型参数是否匹配实际类型 3. 资源是否在对应 `res` 目录中正确定义 4. 包名是否正确(第三方库资源需用库的包名) --- ### 相关问题 1. **如何通过资源ID反向获取资源名称?** ```java String resName = getResources().getResourceName(R.id.title); // 返回: "com.your.package:id/title" ``` 2. **为什么 `getIdentifier()` 在 Library Module 中返回0?** 需使用库的包名而非主模块包名: ```java int libResId = getResources().getIdentifier( "lib_title", "string", "com.example.library" // 库的包名 ); ``` 3. **如何处理多语言资源的ID转换?** 资源ID与语言无关,同一资源名称在所有语言配置中返回相同ID。 4. **资源ID的整数会变化吗?** 每次编译后资源ID可能变化,**不要硬编码ID**,始终使用动态获取或 `R.xx` 引用[^4]。 [^1]: 使用 `setText(int resid)` 直接设置字符串资源ID [^2]: 反射查询资源表可能导致性能损耗 [^4]: 硬编码资源ID会导致编译后失效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值