如何解决更改语言环境已在Android 10中停止工作
我一直在使用以下代码来更改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
- 确保基本上下文始终是包装器(aosp / 1194355)
- 添加了一些改进,以便在修改基本上下文配置(aosp / 1204543)时更加聪明
- 已禁用Robolectric的createConfigurationContext()(aosp / 1186218)
解决方法
我正在发布对我有用的Google员工的回复。我在他们的问题跟踪器上询问了问题,他们建议创建一个新的Configuration实例,而不是修改现有的实例。
因此,代替此操作(以下操作将无效):
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
应该是这样(可行):
val configuration = Configuration()
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。