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

