就在最近,Android API 25中已弃用context.getResources().updateConfiguration(),建议改用context. updateConfiguration()。
有谁知道如何使用configurationContext来覆盖android系统区域设置?
在此之前,将通过:
Configuration config = getBaseContext().getResources().getConfiguration();
config.setLocale(locale);
context.getResources().updateConfiguration(config,
context.getResources().getDisplayMetrics());
9条答案
按热度按时间6ju8rftf1#
受Calligraphy的启发,我最终创建了一个上下文 Package 器。在我的情况下,我需要覆盖系统语言,为我的应用程序用户提供更改应用程序语言的选项,但这可以用您需要实现的任何逻辑进行自定义。
为了注入你的 Package 器,在每个Activity中添加以下代码:
更新22/12/2020在Android材质库实现ContextThemeWrapper以支持黑暗模式后,语言设置将中断,语言设置丢失。经过几个月的苦苦思索,通过向Activity和Fragment onCreate方法添加以下代码,问题得到了解决
更新2018年10月19日有时在方向更改或活动暂停/恢复后,Configuration对象重置为默认系统配置,结果我们会看到应用显示英文“en”文本,即使我们使用法语“fr”locale Package 上下文。因此,作为一个好的实践,永远不要在Activity或片段的全局变量中保留Context/Activity对象。
此外,在MyBaseFragment或MyBaseActivity中创建并使用以下内容:
此实践将为您提供100%无bug的解决方案。
kjthegm62#
大概是这样的:
奖励:一篇博客文章,使用了mysql()
2exbekwf3#
我已经解决了这个问题,没有创建任何自定义
ContextWrapper
。首先我创建了一个扩展函数
然后在Activity的
attachBaseContext
方法中,简单地将上下文替换为新的上下文。clj7thdc4#
没有100%的工作解决方案。您需要同时使用
createConfigurationContext
和applyOverrideConfiguration
。否则,即使您将每个Activity中的baseContext
替换为新配置,Activity仍将使用旧区域设置的ContextThemeWrapper
中的Resources
。下面是我的解决方案,适用于API 29:
将
MainApplication
类从以下位置子类化:此外,每个
Activity
来自:添加
LocaleExt.kt
和以下扩展函数:在
res/values/arrays.xml
数组中添加您支持的语言:我想提一下:
config.setLayoutDirection(toLocale);
来改变布局方向,当你使用阿拉伯语,波斯语等RTL语言环境时。"sys"
是一个表示“继承系统默认语言”的值。ContextWraper
,只需将createConfigurationContext
返回的新上下文设置为baseContextcreateConfigurationContext
时,你应该传递配置从头开始,并且只设置Locale
属性。不应为该配置设置任何其他属性。因为如果我们为这个配置设置一些其他属性(例如 orientation),我们将永远覆盖这个属性,即使我们旋转屏幕,我们的上下文也不再更改这个 orientation 属性。recreate
活动是不够的,因为applicationContext将保留旧的locale,并且它可能会提供意外的行为。因此,请听取首选项更改并重新启动整个应用程序任务:ojsjcaue5#
我的灵感来自于书法和我自己,我创造了这个。
首先,你必须创建一个Application的子类:
然后你需要将其设置为AndroidManifest.xml应用程序标签:
并将其添加到您的AndroidManifest.xml活动标签中。
请注意,sample_locale是这样的字符串资源:
如果没有设置locale,则硬编码“en”是默认lang
mlmc2os56#
以下是@ martel-mourjan的解决方案,带有一点Kotlin的优点:):
这是你如何使用它:
2ul0zpep7#
这里有一个简单的contextWrapper解决方案:Android N更改语言时请注意recreate()方法
q5iwbnjs8#
受Bassel Kotlin jan的启发(接受答案),我创建了自己的Kotlin静态函数:
它可以动态更改语言,并在SDK 34上工作。您需要为每个each上下文调用它,因此我在基础片段(单活动方法)+applicationContext的App类中执行。在执行函数后,你需要使你的UI无效-不要忘记这样做。
2q5ifsrm9#
试试这个: