如何根据传入参数动态替换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
相关产品推荐
相关产品推荐

