更改语言环境在 Android 10 中停止工作
Posted
技术标签:
【中文标题】更改语言环境在 Android 10 中停止工作【英文标题】:Changing locale stopped working in Android 10 【发布时间】:2020-12-07 05:32:55 【问题描述】:我一直在使用以下代码来更改 android 应用中的区域设置(该应用有自己的区域设置,可能与操作系统区域设置不同)。该代码在 Android 9 (P) 之前运行良好。在 Android 10 (Q) 中,它停止工作,资源没有更新。我在 Android 10 发行说明中看不到任何与语言环境相关的更改。什么可以在 Android 10 中破坏此代码?如果它是已知的,谁能指出我的解决方案?
private fun setLocale(context: Context, language: String): Context
//...persist here. persisting works fine
return if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N)
updateResources(context, language)
else
updateResourcesLegacy(context, language)
@TargetApi(Build.VERSION_CODES.N)
private fun updateResources(context: Context, language: String): Context
val locale = Locale(language)
Locale.setDefault(locale)
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
return context.createConfigurationContext(configuration)
UPD:
我发现此代码在升级到androidx.appcompat:appcompat
的较新版本后停止工作。我可以缩小范围:它适用于1.2.0-alpha01
,不适用于1.2.0-alpha02
。
我在 1.2.0-alpha02
的发行说明中看到与上下文相关的 3 处更改:https://developer.android.com/jetpack/androidx/releases/appcompat#1.2.0-alpha02
【问题讨论】:
如何获取资源?是否有一些资源不会改变或全部? ADM,没有更新。 【参考方案1】:我发布了对我有用的 Google 员工的回复。我在他们的问题跟踪器上问了这个问题,他们建议创建一个新的配置实例而不是修改现有的实例。
所以,代替这个(下面的行不通):
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
应该是(这行得通):
val configuration = Configuration()
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
他们的测试中使用了这种方式:one 和 two
【讨论】:
你能告诉我你是如何调用你的 setLocale() 的吗,它似乎不适用于我在 android 10 上。 我从 3 个地方调用setLocale()
:应用程序的 onConfigurationChanged
、活动的 attachBaseContext
,以及当用户从设置更改区域设置时在我的自定义 UI 侦听器中。可以看一下源码:github.com/ptr-dorjin/feelings/blob/master/app/src/main/kotlin/…以上是关于更改语言环境在 Android 10 中停止工作的主要内容,如果未能解决你的问题,请参考以下文章
当我在android中更改应用程序中的语言环境时如何重新加载当前视图