android `application.resources.getString` 没有提供正确的本地化值

问题描述 投票:0回答:1

我需要从字符串资源设置 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 localization viewmodel
1个回答
0
投票

我的申请中的所有文本都在更新,除了那些我 使用

getString
从 android-viewmodel 设置。

您不能使用应用程序上下文来获取本地化的字符串,这将始终返回默认的字符串值;无论从哪里调用它;

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))
}
© www.soinside.com 2019 - 2024. All rights reserved.