为什么android在以编程方式设置时不能将语言环境识别为RTL?

时间:2016-05-10 14:14:44

标签: android localization locale globalization right-to-left

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

我有不同语言的values文件夹,例如values-favalues-ru。由于其中一些语言如波斯语和阿拉伯语是RTL,我使用不同的布局设计,将一些其他布局 .xml 文件放在主layout-ldrtl文件夹旁边的文件夹layout

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

<bool name="is_right_to_left">true</bool>

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

每当我需要知道代码时,我会用这一行来理解当前的语言环境是否是RTL语言:

isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left);

我用不同的设备配置测试了应用程序,一切都像魅力一样。例如,将设备语言设置为Farsi会导致应用从values-fa读取字符串,从layout-ldrtl读取布局,而当为设备设置阿拉伯语时,将从values-ar读取值并布局也可以从layout-ldrtl读取,因为它们都是RTL语言。它当然也适用于LTR语言。这就是我想要的。

当我以编程方式设置应用程序的区域设置时,会出现问题。这是我在onCreate()的{​​{1}}方法中编写的代码:

MainActivity

现在,根据语言正确读取值,但永远不会读取Locale myLocale = new Locale("fa"); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, dm); layout-ldrtl。因此,由于错误的 .xml 文件和错误的values-ldrtl变量值,应用程序会加载LTR设计。 我测试的一个解决方案是将这些 .xml 文件分别放在每个语言布局文件夹中,并且它可以正常工作。但我希望能够找到一种更好,更整洁的方法来解决问题。 除了解决方案,为什么android会以这种方式行事?

1 个答案:

答案 0 :(得分:4)

试试这个:

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 );