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

Android如何通过字符串名称获取drawable目录下的图片资源

问题描述

我现在持有drawable文件夹下资源对应的字符串名称,希望访问drawable文件夹获取对应资源,用于修改Icon View的展示内容。
现有资源名称列表示例如下:

val iconList = ["ic_apple","ic_banana","ic_melon"]

且ic_apple.png、ic_banana.png、ic_melon.png均已存放在我的drawable文件夹中。
参考Java实现代码如下:

String name = "your_drawable";
int id = getResources().getIdentifier(name, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
        
view.setBackground(drawable)

请问该如何实现对应需求?

实现方案

核心逻辑是通过getIdentifier方法用资源名称查询对应的资源ID,再加载Drawable设置给View即可,以下是适配全版本系统的实现代码:

Kotlin 实现

val iconList = listOf("ic_apple", "ic_banana", "ic_melon")

// 按需取对应资源名称,此处以第一个ic_apple为例
val targetIconName = iconList[0]
// 查询资源ID
val resId = resources.getIdentifier(targetIconName, "drawable", packageName)

if (resId != 0) { // 找不到对应资源时resId会返回0,提前判断避免崩溃
    // ContextCompat加载Drawable自带主题兼容,适配所有系统版本
    val targetDrawable = ContextCompat.getDrawable(this@YourActivity, resId)
    // 设置View背景
    yourIconView.background = targetDrawable
    // 如果是ImageView要设置前景图标,用下方写法
    // (yourIconView as ImageView).setImageDrawable(targetDrawable)
}

注意事项:

  • 如果在Fragment中调用,需要通过上下文获取资源:requireContext().resources.getIdentifier(...)
  • 如果在非组件类中调用,需要传入合法的Context实例再执行资源查询

Java 实现

List<String> iconList = Arrays.asList("ic_apple", "ic_banana", "ic_melon");
// 此处以第二个元素ic_banana为例
String targetIconName = iconList.get(1);
int resId = getResources().getIdentifier(targetIconName, "drawable", getPackageName());

if (resId != 0) {
    Drawable targetDrawable = ContextCompat.getDrawable(YourActivity.this, resId);
    yourIconView.setBackground(targetDrawable);
    // ImageView设置图标的写法
    // ((ImageView)yourIconView).setImageDrawable(targetDrawable);
}

小提示:getIdentifier 会执行资源查询逻辑,性能比直接用R.drawable.xxx调用低,如果是固定的资源列表建议提前把ID存在集合里,避免重复查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:06:03