为何通过编程设置时android无法将语言环境识别为RTL?

EmJ*_*ash 4 globalization android locale localization right-to-left

我写了一个多语言的应用程序。

我有不同的values文件夹,用于支持values-fa和等不同的语言values-ru。由于其中一些语言(如波斯语和阿拉伯语)是RTL,因此我通过将其他一些布局.xml文件layout-ldrtl放在主layout文件夹旁边的文件夹中,使用了不同的布局设计。

我还将一个名为is_right_to_left.xmlint的文件放在一个名为的文件夹中values-ldrtl,该文件夹定义了这样的变量:

<bool name="is_right_to_left">true</bool>
Run Code Online (Sandbox Code Playgroud)

我在values文件夹中有相同的文件,并将变量值设置在false那里。

每当我需要知道的代码时,我都会使用此行来了解当前语言环境是否是RTL:

isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left);
Run Code Online (Sandbox Code Playgroud)

我已经使用不同的设备配置测试了该应用程序,并且一切正常工作。例如,将设备语言设置为Farsi会导致应用从中读取字符串values-fa和布局layout-ldrtl,而为设备设置了阿拉伯语时,则从中读取值,也从中读取values-ar布局,layout-ldrtl因为它们都是RTL语言。当然,它也适用于LTR语言。这是我想要的。

当我以编程方式设置应用程序的语言环境时,会发生问题。这是我在onCreate()my方法中编写的代码MainActivity

Locale myLocale = new Locale("fa");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Run Code Online (Sandbox Code Playgroud)

现在,值根据语言正确读取,但layout-ldrtlvalues-ldrtl被从来没有读过。因此,由于错误的.xml文件和错误的isRightToLeft变量值,该应用程序将在LTR设计中加载。我测试过的一种解决方案是将这些.xml文件分别放在每个语言布局文件夹中,并且可以正常工作。但是我希望找到一种更好,更整洁的方法来解决问题。除了解决方案,为什么Android会以这种方式运行?

小智 5

尝试这个:

Resources res = getResources();
 Configuration newConfig = new Configuration( res.getConfiguration() );
 Locale locale = new Locale("fa");
 Locale.setDefault(locale);
 newConfig.locale = locale;
 newConfig.setLayoutDirection( locale );
 res.updateConfiguration( newConfig, null );
Run Code Online (Sandbox Code Playgroud)