我需要从字符串资源设置 UI 元素的值。这是一个本地化的应用程序。我认为这会非常简单:
textField.postValue(getApplication<Application>().resources.getString(R.string.text))
当我选择语言时,我将其设置为
SharedPreferences
,然后在 attachBaseContext
上,我将该语言设置为区域设置:
private fun Context.setAppLocale(language: String): Context {
val locale = Locale(language)
Locale.setDefault(locale)
val config = resources.configuration
config.setLocale(locale)
config.setLayoutDirection(locale)
return createConfigurationContext(config)
}
override fun attachBaseContext(newBase: Context) {
// read from sharedpref
...
super.attachBaseContext(ContextWrapper(newBase.setAppLocale(language)))
}
选择语言后,我只需重新启动应用程序即可。
我如何重新启动应用程序:
editor.apply()
finish()
startActivity(intent)
我的应用程序中的所有文本都在更新,除了我使用
getString
从 android-viewmodel 设置的文本。
任何人都可以帮助我,在视图模型中为我的应用程序获取正确的本地化值吗?
我的申请中的所有文本都在更新,除了那些我 使用
从 android-viewmodel 设置。getString
您不能使用应用程序上下文来获取本地化的字符串,这将始终返回默认的字符串值;无论从哪里调用它;
ViewModel
或其他地方。
要获取本地化字符串,您必须在活动(基础)上下文上调用资源对象。
最佳实践是避免处理具有
ViewModels
生命周期的对象。 ViewModels
无意使用 Context 获取资源。这应该在视图上完成;显然是因为你需要它来更新现有的 UI/视图;因此,与 ViewModel
关联的 UI(活动/片段)是执行此操作的正确位置。
如果需要在
ViewModel
中执行此操作,那么您将从 View 作为函数参数传递 baseContext
,而不是存储在 ViewModel
中。
这个问题已经讨论过了,你看看吧。
类似:
val textField: LiveData<...>
updateTextField(context: Context) {
textField.postValue(context.resources.getString(R.string.text))
}