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
相关产品推荐
相关产品推荐

