要更改语言环境,我正在使用创建新 Context 并将其传递到#super.attachBaseContext
.
这适用于活动,因为在我的用例中,它适用于主工作流开始之前的初始活动,所以我可以简单地调用#Activity.recreate()
并attachBaseContext
再次调用。
但是,Application 类并非如此,我使用 Application Context 来加载 Context 不容易获得的资源,例如 View Models、Repositories 和 Helper 类。
因此,当使用应用程序上下文访问时,语言环境不会更新,因为我不会让应用程序类在任何地方知道资源已更改。#Application.attachBaseContext
只能调用一次,我找不到重新创建应用程序类的方法,这也会是一个糟糕的用户体验。
那么有没有办法动态地重新加载应用级资源呢?有没有办法重新创建应用程序类?
我们如何动态更改应用程序级别资源的区域设置?
override fun attachBaseContext(newBase: Context?) {
newBase?.let {
val langCode : String = LocaleHelper().getCurrentLocale().code
toast("attachBaseContext")
val context : Context = changeLang(it, langCode)
super.attachBaseContext(context)
} ?: run {
super.attachBaseContext(newBase)
}
}
private fun changeLang(newContext: Context, langCode: String): ContextWrapper {
var context = newContext
val sysLocale: Locale
val rs = context.resources
val config = rs.configuration
if (langCode != "") {
val locale = Locale(langCode)
Locale.setDefault(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(locale)
} else {
config.locale = locale
}
context = context.createConfigurationContext(config)
}
return ContextWrapper(context)
}