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

