Android开发如何通过strings.xml中的字符串值获取对应String资源ID
问题解答
Android 系统没有提供官方的反向查找 API 直接通过字符串值获取对应的 string 资源 ID/资源名,你可以通过遍历所有 string 资源做匹配的方式实现该需求。
实现思路
- 反射获取
R.string类下所有的静态字段,每个字段的名称对应资源名(如示例中的text1),字段的 int 值对应资源 ID - 遍历每个字段,用 Context 拿到对应资源 ID 的字符串值,和你传入的目标字符串做匹配
- 匹配成功后返回对应的资源 ID 和资源名
代码实现(Kotlin)
fun findStringResByValue(context: Context, targetString: String): Pair<Int, String>? { // 遍历R.string下的所有字符串资源 val stringFields = R.string::class.java.declaredFields for (field in stringFields) { try { val resId = field.getInt(null) val resValue = context.getString(resId) if (resValue == targetString) { // 第一个返回值为资源ID的int值,第二个返回值为资源名(即你需要的text1) return Pair(resId, field.name) } } catch (e: Exception) { // 跳过异常字段 continue } } // 无匹配结果返回null return null }
调用示例:
val result = findStringResByValue(context, "Dummy Text") result?.let { val resId = it.first val resName = it.second // 匹配成功后resName的值为text1 }
代码实现(Java)
import android.util.Pair; import android.content.Context; public static Pair<Integer, String> findStringResByValue(Context context, String targetString) { Field[] stringFields = R.string.class.getDeclaredFields(); for (Field field : stringFields) { try { int resId = field.getInt(null); String resValue = context.getString(resId); if (resValue.equals(targetString)) { return new Pair<>(resId, field.getName()); } } catch (Exception e) { continue; } } return null; }
注意事项
- 多语言适配:默认匹配的是当前系统语言对应的字符串值,如果需要匹配指定语言的字符串,需要构造对应语言配置的 Context 来获取资源值
- 重复值处理:如果多个 string 资源定义了相同的字符串值,上述方法默认返回第一个匹配到的结果,如有需要可修改逻辑返回所有匹配结果
- 性能优化:如果需要频繁执行该查找操作,建议首次遍历时生成<字符串值, 资源信息>的缓存字典,后续直接查缓存减少性能损耗
- 多模块适配:如果你的项目有多模块/产品变种,需要遍历对应模块的
R.string类,否则无法匹配到其他模块下的字符串资源
内容的提问来源于stack exchange,提问作者Abdulsamet Kılınçarslan
相关产品推荐
相关产品推荐

