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

Kotlin Jetpack:如何通过字符串数组加载Drawable资源

解决Jetpack Compose循环加载Drawable图片的问题

你当前的写法无法生效,因为R.drawable.xxx是编译期生成的静态int常量,不能直接通过字符串变量动态引用。正确的做法是通过资源名称获取对应的资源ID,再传入painterResource,具体实现如下:

完整代码示例

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.platform.LocalContext
import android.content.res.Resources

@Composable
fun LoadIconsFromArray() {
    val imageNames = arrayOf("image1", "image2")
    val context = LocalContext.current
    val resources: Resources = context.resources

    // 根据图片名称获取Drawable资源ID
    fun getDrawableId(imageName: String): Int {
        return resources.getIdentifier(
            imageName,
            "drawable",
            context.packageName
        )
    }

    Column {
        imageNames.forEach { imageName ->
            val drawableId = getDrawableId(imageName)
            // 校验资源是否存在,避免找不到资源导致崩溃
            if (drawableId != 0) {
                Icon(
                    painter = painterResource(id = drawableId),
                    modifier = Modifier.size(30.dp),
                    contentDescription = "drawable icon: $imageName",
                    tint = Color.Unspecified
                )
            }
        }
    }
}

关键说明

  1. 获取资源ID:使用Resources.getIdentifier()方法,传入图片名称、资源类型(固定为"drawable")和当前应用包名,动态获取对应的资源ID。如果找不到匹配的资源,该方法会返回0。
  2. Compose上下文获取:通过LocalContext.current获取当前上下文,进而拿到Resources对象。
  3. 遍历优化:使用forEach直接遍历数组元素,比通过indices索引更简洁直观。
  4. 资源校验:增加drawableId != 0的判断,避免因资源名称错误或缺失导致的运行时崩溃。

注意事项

  • 确保drawable文件夹内的图片名称与数组中的字符串完全匹配(包括大小写,Android资源名称区分大小写)。
  • 无论是位图(如png、webp)还是矢量图(VectorDrawable),该方法均适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27