Android Kotlin:如何使用变量ID调用getString()获取文本
解决Kotlin中动态获取字符串资源ID的问题
嗨,这个问题我之前也碰到过!其实核心原因是R.string.id_1本质上是一个Int类型的资源常量,不是字符串,所以你直接用字符串拼接的方式肯定不行——getString()只认对应的Int资源ID,不认字符串名字。下面给你几种靠谱的解决办法:
方法一:使用getIdentifier()动态查找资源ID
Android的Resources类提供了getIdentifier()方法,可以通过资源名称、类型和包名来获取对应的Int ID,刚好适配你的需求:
// 假设你的动态资源名称是myId val myId = "id_1" // 获取对应的字符串资源ID val resId = resources.getIdentifier(myId, "string", packageName) // 一定要判断是否找到有效ID(找不到会返回0) if (resId != 0) { val targetText = getString(resId) // 在这里使用targetText } else { // 处理资源不存在的情况,比如显示默认文本 println("找不到名为$myId的字符串资源") }
⚠️ 注意:这个方法是通过反射实现的,性能会比直接用R.string.xxx稍差一点,如果是频繁调用的场景建议用下面的方法。另外要确保资源名称完全匹配,大小写、下划线都不能错。
方法二:用枚举/密封类做类型安全的资源映射
如果你的动态ID范围是固定的,推荐用枚举类来管理所有可能的字符串资源,这样既能实现动态获取,又能保证编译时的类型安全:
// 定义枚举类,把字符串名称和对应的资源ID绑定 enum class AppStringRes(val resId: Int) { ID_1(R.string.id_1), ID_2(R.string.id_2), // 可以继续添加其他资源 } // 使用时,根据动态变量获取对应的枚举实例 val myId = "id_1" val targetRes = AppStringRes.valueOf(myId.uppercase()) // 注意枚举名是大写的,需要转换 val targetText = getString(targetRes.resId)
这种方法的好处是不会出现拼写错误导致的运行时崩溃,编译阶段就能发现问题,非常适合资源数量固定的场景。
方法三:用Map建立字符串到资源ID的映射
如果你的动态ID是从外部(比如后端接口)获取的,且数量不多,可以直接建一个Map来做映射:
// 提前建立字符串名称到资源ID的映射表 val stringIdMap = mapOf( "id_1" to R.string.id_1, "id_2" to R.string.id_2, "welcome_msg" to R.string.welcome_message ) // 动态获取时直接从Map中取值 val myId = "id_1" val resId = stringIdMap[myId] ?: run { // 找不到对应ID时的默认处理 println("未知的字符串ID:$myId") R.string.default_text // 或者抛出异常 } val targetText = getString(resId)
这种方法查找速度快,也很灵活,适合资源名称和后端约定好的场景。
内容的提问来源于stack exchange,提问作者user21681




