首页 文章

为什么android在编程时没有将语言环境识别为RTL?

提问于
浏览
3

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

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

我还将一个名为 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语言 . 这就是我想要的 .

当我以编程方式设置应用程序的区域设置时,会发生此问题 . 这是我在 MainActivityonCreate() 方法中编写的代码:

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

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

1 回答

  • 3

    试试这个:

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

相关问题