You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发如何通过drawable图片文件名获取对应资源ID?

问题原因

R.drawable类下的所有资源ID都是编译阶段生成的固定常量,不支持通过变量名动态引用。你写的R.drawable.TestString会被编译器识别为查找名为TestString的drawable资源,和你定义的字符串变量TestString没有关联,自然无法匹配到目标资源。

正确实现方式

使用Resources.getIdentifier()方法动态匹配资源名获取ID,注意几个规则:

  • 资源名字符串不需要带文件后缀(比如.png、.jpg都要去掉)
  • 需要传入资源类型、应用包名两个参数完成匹配
  • 方法找不到对应资源时会返回0,必须做容错判断避免崩溃

代码示例

如果在Activity、Fragment等持有Context的场景中,直接按如下方式写:

// 去掉文件后缀,仅保留资源名
val testString: String = "test1"
// 动态获取资源ID
val testId: Int = resources.getIdentifier(
    testString,
    "drawable",
    packageName
)

// 容错判断
if (testId != 0) {
    // 找到资源,执行后续加载逻辑,例如给ImageView设置图片
    imageView.setImageResource(testId)
} else {
    // 资源不存在,加载兜底图或做其他异常处理
}

如果在普通工具类等没有直接持有Context的场景,传入Context对象即可调用:

val testString: String = "test1"
val testId: Int = context.resources.getIdentifier(
    testString,
    "drawable",
    context.packageName
)
注意事项
  • drawable资源命名必须符合标识符规范:仅支持小写字母、数字、下划线,不能以数字开头,不能包含大写字母和特殊字符,否则会出现R文件生成失败、资源匹配不到的问题
  • getIdentifier基于反射实现,性能略低于直接引用固定R资源,如果不需要动态匹配资源名,优先使用R.drawable.xxx的固定引用方式

内容的提问来源于stack exchange,提问作者RealyJuniorGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:24:25