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 ) } } } }
关键说明
- 获取资源ID:使用
Resources.getIdentifier()方法,传入图片名称、资源类型(固定为"drawable")和当前应用包名,动态获取对应的资源ID。如果找不到匹配的资源,该方法会返回0。 - Compose上下文获取:通过
LocalContext.current获取当前上下文,进而拿到Resources对象。 - 遍历优化:使用
forEach直接遍历数组元素,比通过indices索引更简洁直观。 - 资源校验:增加
drawableId != 0的判断,避免因资源名称错误或缺失导致的运行时崩溃。
注意事项
- 确保drawable文件夹内的图片名称与数组中的字符串完全匹配(包括大小写,Android资源名称区分大小写)。
- 无论是位图(如png、webp)还是矢量图(VectorDrawable),该方法均适用。
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

