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



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

例如,我有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]
}

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

这种方法好吗?或者我应该为这个问题创建一个单独的类吗?我试图避免使用AndroidViewModel,因为这被认为是一种糟糕的做法。

您不应该在ViewModel中缓存String资源,因为ViewModel可以经受住配置更改,但字符串资源不应该,因为配置更改可能是对区域设置或语言的更改。

我认为最简单的方法是在你的活动或片段中使用一个懒惰的委托:

val myStrings by lazy { resources.get(R.array.myStrings) }

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

如果它在各种碎片中使用,我会把这个属性放在"活动"中。

我使用一个活动,所以我认为为我的碎片创建一个扩展属性以访问活动的唯一属性是安全的,比如:

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

最新更新