在哪里初始化各种片段使用的静态值?

Where to initialize static values, used by various fragments?

我会尽可能简单地描述我的问题。

例如,我在资源中存储了 10 个字符串。

但是在我的代码中,我对这个字符串的调用太多,因此,为了使我的代码更具可读性,我想避免使用对它们的直接访问:resources.getString(R.string.nameOne)resources.getStringArray(R.array.names)

相反,我想在一个地方将它们初始化为值,这样我就可以在需要时从中检索它们。

我尝试将它们存储在 ViewModel 中,但是由于 ViewModel 无法直接访问应用上下文,我这样做了:

lateinit var nameOne: String
lateinit var nameTwo: String
lateinit var nameThree: String
...
lateinit var nameTen: String

fun initializeNames(list: Array<String>) {
nameOne = list[0]
nameTwo = list[1]
nameThree = list[2]
...
nameTen = list[9]
}

基本上我会在需要时调用一次此方法,并直接从资源中放入名称数组。之后我在我想要的任何片段中使用这些值。

这个方法好吗?或者我应该为这件事创建一个单独的 class 吗?我试图避免使用 AndroidViewModel,因为这被认为是不好的做法。

您不应在 ViewModel 中缓存字符串资源,因为 ViewModel 在配置更改后仍然存在,但字符串资源不应缓存,因为配置更改可能是语言环境或语言的更改。

我认为最简单的做法是在 Activity 或 Fragment:

中使用惰性委托
val myStrings by lazy { resources.get(R.array.myStrings) }

这将在第一次访问时从磁盘中获取字符串,但将在每次后续访问时使用内存中的缓存副本。如果 Activity 或 Fragment 由于配置更改而重新创建,它将是一个新实例,因此它将再次从磁盘中重新获取它们。

如果在各种片段中使用它,我会把这个 属性 放在 Activity 中。

我使用单个 Activity,因此我认为为我的片段创建扩展 属性 以访问 Activity 的独特属性是安全的,如下所示:

val Fragment.myActivity: MyActivity
    get() = requireActivity() as MyActivity