Android:如何动态更改应用程序级别资源的语言环境?

3
为了改变语言环境,我使用创建新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)
}
1个回答

0

我对这个主题进行了很多搜索,最后发现可以使用Android-Localization来进行Android本地化,因为它默认根据设备语言进行设置

注意:在 Android 6.0 及以下版本中使用 Android-Localization 库可能会遇到问题,所以请进行充分的测试!


我猜它会处理这里提到的问题。如果是这样,你在使用这个库时遇到过什么问题吗? - undefined
使用旧版本时,我遇到了一个与对话框正按钮相关的用户界面问题。而且在Android 6.0及以下版本中,整个库都无法正常工作。如果您在使用新版本时仍然遇到此问题,请给我留言以添加我的修复代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接