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

Kotlin如何将drawable资源文件绑定到变量以动态获取资源ID

解决方案

方案1:动态通过文件名获取资源ID(适合动态资源场景)

直接用Android系统提供的Resources.getIdentifier()方法,通过资源名称、资源类型、应用包名三个参数动态查询资源ID,不需要手写逐个匹配逻辑,适配你的文件名规则wp + (number + 1)。
示例代码:

fun setWallpaper(number:Int) {
    val wallpaperManager = WallpaperManager.getInstance(context)
    // 拼接对应的drawable文件名,number从0开始,所以+1对应wp1、wp2...的命名规则
    val resName = "wp${number + 1}"
    // 动态获取资源ID,返回0代表未找到对应资源
    val resId = context.resources.getIdentifier(resName, "drawable", context.packageName)
    if (resId != 0) {
        wallpaperManager.setResource(resId)
    } else {
        // 此处可添加资源不存在的兜底处理逻辑,比如弹出提示
    }
}

注意事项

  • 该方法内部通过反射查询资源,单次调用开销不大,但若需要频繁调用(比如列表滚动时批量加载)建议使用方案2
  • 必须保证drawable文件名和拼接的resName完全一致,Android资源名不支持大写字母、特殊字符

方案2:预加载资源ID列表(适合固定资源场景,性能更高)

如果你的drawable壁纸资源是固定的,提前一次性初始化所有资源ID到列表中,后续直接通过索引取值,性能比方案1高,也不会出现资源找不到的问题。
示例代码:

// 提前初始化壁纸资源列表,可放在ViewModel或者全局常量区
val wallpaperResList = buildList {
    // 批量生成资源ID,数字范围替换为你实际的资源总数即可
    for (i in 1..100) {
        val resId = context.resources.getIdentifier("wp$i", "drawable", context.packageName)
        if (resId != 0) add(resId)
    }
}

fun setWallpaper(number:Int) {
    val wallpaperManager = WallpaperManager.getInstance(context)
    // 先判断索引是否合法避免越界
    if (number in wallpaperResList.indices) {
        wallpaperManager.setResource(wallpaperResList[number])
    }
}

内容的提问来源于stack exchange,提问作者S.Beigi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:57:02