我有一个多语言应用程序,主要语言为英语,次要语言为阿拉伯语。
我在我的应用程序中的每个活动的
onCreate()
中调用setLocale()
:public static void setLocale(Locale locale){
Locale.setDefault(locale);
Context context = MyApplication.getInstance();
final Resources resources = context.getResources();
final Configuration config = resources.getConfiguration();
config.setLocale(locale);
context.getResources().updateConfiguration(config,
resources.getDisplayMetrics());
}
其中locale
是以下内容之一:
super.onCreate(savedInstanceState)
之前调用。如文档所述,
- 我已将
android:supportsRtl="true"
添加到清单中。 - 我已将所有具有
left
和right
属性的xml属性更改为分别为start
和end
。 - 我已将阿拉伯语字符串放入
res\values-ar\strings
文件夹中,并将可绘制资源放入res\drawable-ar
文件夹中(其他资源同样)。
Locale
更改为ar-AE
后,我的活动中正确显示了阿拉伯文本和资源。但是,所有Android设备版本8.0及以上的资源和布局方向存在问题。
在版本小于8.0的设备上,RTL屏幕正确地显示如下:
在所有8.0+的设备上,相同的屏幕会显示为以下内容:
这是错误的。
事实证明,方向和资源的显示都不正确。
这里有两个问题:
- 整个应用程序配置中似乎没有更新正确的
Locale
。 - 文本和可绘制对象的方向与应该的相反。
关于方向,有一个奇怪的方法叫做setLayoutDirection()
,我之前没有注意到。
我想知道这个问题是什么,为什么会在Oreo中出现,以及解决方法。请帮忙/评论此事。
编辑:
根据API差异报告,updateConfiguration()
方法在Android 7.1(API级别25)中已被弃用。此外,找到了所有相关帖子。按重要性顺序排列如下:1. Android N如何通过编程更改语言。
2. Android context.getResources.updateConfiguration()已过时。
3. 如何更改Android O / Oreo / api 26应用程序的语言。
4. Android RTL问题在API 24及更高版本上当区域设置更改时。
5. 在Android N 7.0 - API 24中编程更改语言 6. Android N - 在运行时更改区域设置 7. Android Oreo中RTL布局错误