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

如何根据传入参数动态替换R.drawable中的数值设置图片资源

Android动态根据参数替换drawable资源的实现方案

方法一:使用Resources.getIdentifier()动态获取资源ID

这种方法适合参数范围不固定的场景,通过字符串拼接资源名称,再获取对应的ID:

private fun datamain(date: Int) {
    // 拼接目标资源名称,比如传入7就得到"im_zd_7"
    val drawableName = "im_zd_$date"
    // 获取资源ID,三个参数分别是资源名、资源类型、应用包名
    val drawableId = resources.getIdentifier(drawableName, "drawable", packageName)
    
    // 一定要检查资源是否存在,防止传入无效参数导致崩溃
    if (drawableId != 0) {
        binding.imIconZod.setImageResource(drawableId)
    } else {
        // 资源不存在时,设置一张默认图作为兜底
        binding.imIconZod.setImageResource(R.drawable.im_zd_default)
    }
}

注意:getIdentifier()会遍历资源表,性能略差,不建议在频繁调用的场景(比如RecyclerView的Adapter)中使用。

方法二:提前创建资源ID映射数组(推荐)

如果你的参数范围是固定的(比如1到12的星座图),直接把对应的drawable ID存入数组,通过索引直接获取,性能更优且类型安全:

// 在类内定义映射数组,按参数值对应顺序排列(比如索引0对应参数1,索引1对应参数2...)
private val zodDrawableIds = arrayOf(
    R.drawable.im_zd_1,
    R.drawable.im_zd_2,
    R.drawable.im_zd_3,
    R.drawable.im_zd_4,
    R.drawable.im_zd_5,
    R.drawable.im_zd_6,
    R.drawable.im_zd_7,
    // 继续添加到你需要的最大参数对应的资源
    R.drawable.im_zd_12
)

private fun datamain(date: Int) {
    // 检查参数是否在有效范围内,避免数组越界
    if (date in 1..zodDrawableIds.size) {
        // 参数减1是因为数组索引从0开始
        binding.imIconZod.setImageResource(zodDrawableIds[date - 1])
    } else {
        // 参数无效时的兜底处理
        binding.imIconZod.setImageResource(R.drawable.im_zd_default)
    }
}

这种方法没有字符串拼接和资源遍历的开销,代码更安全,推荐优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:09