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
相关产品推荐
相关产品推荐

