1

要更改语言环境,我正在使用创建新 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)
}
4

1 回答 1

0

我搜索了很多以使用Android-Localization结尾的相同主题,因为 Android 本地化默认基于设备语言

注意:您可能会在使用 Android-Localization 库的 android 6.0 及更低版本上遇到问题,因此请好好测试一下!

于 2020-01-21T09:30:29.527 回答