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

Kotlin中获取Drawable资源数组及构建数据类的类型问题

解决Android资源数组获取与数据类类型问题

我来帮你一步步搞定这两个问题:

问题1:为什么用getIntArray获取Drawable数组得到0?

你定义的<integer-array>里的<item>@drawable/drawer_home</item>是资源引用,不是普通的整数值。getResources().getIntArray()只能读取数组里的原始整数,没法正确解析这种指向Drawable的资源引用,所以返回值会是0。

正确的做法是用TypedArray来处理包含资源引用的数组:

val imagesArray = resources.obtainTypedArray(R.array.drawer_icons)

问题2:DrawerModel中img的正确类型与代码修正

你直接写imagesArray[i]报错,是因为TypedArray不能通过下标直接访问元素,必须调用对应的获取方法。至于img的类型,有两种实用方案:

方案1:存储Drawable资源ID(更推荐,内存友好)

把img的类型设为Int,存储Drawable的资源ID,需要加载Drawable时再通过ID获取,这种方式占用内存更小:

// 修改数据类
data class DrawerModel(var title: String, var imgResId: Int)

// 构建列表的代码
val titlesArray = resources.getStringArray(R.array.drawer_titles)
val imagesArray = resources.obtainTypedArray(R.array.drawer_icons)
val list = ArrayList<DrawerModel>()

for (i in titlesArray.indices) {
    // 获取Drawable的资源ID,第二个参数是找不到时的默认值
    val imgResId = imagesArray.getResourceId(i, 0)
    val model = DrawerModel(titlesArray[i], imgResId)
    list.add(model)
}

// 必须回收TypedArray,避免内存泄漏
imagesArray.recycle()

方案2:直接存储Drawable对象

如果需要直接使用Drawable实例,把img的类型设为Drawable?,调用getDrawable()方法获取:

// 修改数据类
data class DrawerModel(var title: String, var img: Drawable?)

// 构建列表的代码
val titlesArray = resources.getStringArray(R.array.drawer_titles)
val imagesArray = resources.obtainTypedArray(R.array.drawer_icons)
val list = ArrayList<DrawerModel>()

for (i in titlesArray.indices) {
    // 获取Drawable对象,注意可能返回null
    val drawable = imagesArray.getDrawable(i)
    val model = DrawerModel(titlesArray[i], drawable)
    list.add(model)
}

// 回收TypedArray
imagesArray.recycle()

划重点:不管用哪种方案,用完TypedArray后一定要调用recycle(),它会释放底层资源,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:53