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

Kotlin中从TypedArray获取图片时resources对象报错求助

解决resources获取报错并实现随机加载图片的方案

核心问题:上下文依赖错误

resources(或旧API的getResources())必须依赖**Android上下文(Context)**才能调用,报错的本质是当前代码没有关联有效的上下文,或者调用时机不对。以下分场景给出修复方案:

1. 在Activity中调用

直接在onCreate()及之后的生命周期方法内使用resources即可,不要在成员变量初始化阶段调用(此时Activity还未完成初始化):

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 在这里调用才安全
        val images: TypedArray = resources.obtainTypedArray(R.array.images)
        // 后续随机取图逻辑
        images.recycle() // 用完必须回收TypedArray,避免内存泄漏
    }
}

2. 在Fragment中调用

需在onViewCreated()之后调用,用requireContext().resources或view.resources确保上下文有效:

class MyFragment : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val images: TypedArray = requireContext().resources.obtainTypedArray(R.array.images)
        // ...逻辑处理
        images.recycle()
    }
}

3. 在工具类/ViewModel等非UI类中调用

必须手动传入Context参数,不能直接调用resources:

object ImageRandomizer {
    fun getRandomImageResId(context: Context): Int {
        val images = context.resources.obtainTypedArray(R.array.images)
        val randomIdx = (0 until images.length()).random()
        val resId = images.getResourceId(randomIdx, -1)
        images.recycle()
        return resId
    }
}

// 调用示例(Activity中):
val randomImageId = ImageRandomizer.getRandomImageResId(this)

4. 检查arrays.xml配置

确保数组定义正确,资源路径无误:

<resources>
    <array name="images">
        <item>@drawable/pic_1</item>
        <item>@drawable/pic_2</item>
        <item>@drawable/pic_3</item>
    </array>
</resources>

完整随机加载图片示例

class MainActivity : AppCompatActivity() {
    private lateinit var imageView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        imageView = findViewById(R.id.iv_random)

        loadRandomImage()
    }

    private fun loadRandomImage() {
        val images = resources.obtainTypedArray(R.array.images)
        if (images.length() == 0) {
            images.recycle()
            return
        }
        // 生成随机索引
        val randomIdx = (0 until images.length()).random()
        // 获取图片资源ID并显示
        val imgResId = images.getResourceId(randomIdx, -1)
        if (imgResId != -1) {
            imageView.setImageResource(imgResId)
        }
        images.recycle()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:10:59