为了改变语言环境,我使用创建新Context的方法,并将其传递给
但是,在Application类和我正在使用Application Context来加载资源,其中Context不容易获得,例如View Models、Repositories和Helper classes。因此,当使用Application Context访问时,语言环境没有更新,因为我没有在任何地方通知应用程序类资源已更改。
那么,有没有办法动态重新加载应用程序级别的资源?有没有办法重新创建应用程序类?我们如何动态更改应用程序级别资源的语言环境?
#super.attachBaseContext
。对于Activities而言,这种方法很有效,因为在我的用例中,它适用于主工作流开始之前的初始Activities,所以我只需简单地调用#Activity.recreate()
即可再次调用attachBaseContext
。但是,在Application类和我正在使用Application Context来加载资源,其中Context不容易获得,例如View Models、Repositories和Helper classes。因此,当使用Application Context访问时,语言环境没有更新,因为我没有在任何地方通知应用程序类资源已更改。
#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)
}