更改区域设置在 Android 10 后停止工作
Changing locale stopped working in Android 10
我一直在使用以下代码在 Android 应用程序中更改区域设置(该应用程序有自己的区域设置,可能与 OS 区域设置不同)。该代码在 Android 9 (P) 之前工作正常。在Android10(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 (aosp/1186218)
禁用了 createConfigurationContext()
我正在发布对我有用的 Google 员工的回复。我在他们的问题跟踪器上问了这个问题,他们建议创建一个新的配置实例而不是修改现有的实例。
所以,而不是这个(以下行不通):
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
应该是(这个有效):
val configuration = Configuration()
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
我一直在使用以下代码在 Android 应用程序中更改区域设置(该应用程序有自己的区域设置,可能与 OS 区域设置不同)。该代码在 Android 9 (P) 之前工作正常。在Android10(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 (aosp/1186218) 禁用了 createConfigurationContext()
我正在发布对我有用的 Google 员工的回复。我在他们的问题跟踪器上问了这个问题,他们建议创建一个新的配置实例而不是修改现有的实例。
所以,而不是这个(以下行不通):
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
应该是(这个有效):
val configuration = Configuration()
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)