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

Kotlin中如何在MainActivity之外访问遍历strings.xml的string-array

问题根因
  • 错误调用Resources.getSystem():该API仅用于读取Android系统自带的公共资源,无法访问你应用res目录下的自定义资源,必然触发资源未找到异常。
  • Fragment初始化时机错误:init代码块在Fragment实例创建时立即执行,此时Fragment还未和宿主Activity绑定,没有获取到有效的应用上下文,即便资源调用方式正确,此时也无法拿到可用的Resources实例。
  • 额外注意:你给出的示例中字符串数组定义的name为Entries,但代码中读取的是R.array.Cities,请确保资源名完全匹配(大小写敏感),否则也会出现资源找不到的问题。
正确实现方案

官方示例在Activity中可以直接调用resources,是因为Activity本身是Context的子类,原生持有资源访问能力。在Fragment或者其他非Activity组件中,只要拿到有效的应用Context即可读取自定义资源。

Fragment场景写法

将资源读取逻辑放到Fragment生命周期中上下文已绑定的阶段(比如onViewCreated、onCreate),通过requireContext()获取当前绑定的上下文再读取数组:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 读取自定义字符串数组
    val cityArray = requireContext().resources.getStringArray(R.array.Cities)
    // 遍历填充RecyclerView
    cityArray.forEach { city ->
        Log.i("TAG", city)
        addItem(createPlaceholderItem(1, city))
    }
    // 最后通知RecyclerView适配器更新数据即可
}

其他场景通用规则

只要持有有效的应用Context即可读取资源:

  • 自定义View中直接使用自带的context访问:context.resources.getStringArray(R.array.xxx)
  • 非UI组件中建议传入Application级别的Context访问,避免持有Activity/Fragment Context导致内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:54:08