为何通过编程设置时android无法将语言环境识别为RTL?
作者:互联网
我写了一个多语言的应用程序.
对于不同的语言,例如values-fa和values-ru,我有不同的values文件夹.由于其中一些语言(例如波斯语和阿拉伯语)是RTL,因此我通过将其他一些布局.xml文件放在主布局文件夹旁边的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);
我已经使用不同的设备配置测试了该应用程序,并且一切正常工作.例如,将设备语言设置为波斯语会使应用程序从values-fa读取字符串,并从layout-ldrtl读取布局,而当为设备设置阿拉伯语时,则从values-ar读取值,并且还从layout-read读取布局ldrtl,因为它们都是RTL语言.当然,它也适用于LTR语言.这就是我想要的.
当我以编程方式设置应用程序的语言环境时,会发生问题.这是我在MainActivity的onCreate()方法中编写的代码:
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和values-ldrtl.因此,由于错误的.xml文件和isRightToLeft变量的错误值,该应用程序将在LTR设计中加载.
我测试过的一种解决方案是将这些.xml文件分别放在每个语言布局文件夹中,并且可以正常工作.但是我希望找到一种更好,更整洁的方法来解决问题.
除了解决方案,为什么Android会以这种方式运行?
解决方法:
尝试这个:
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 );
标签:locale,globalization,right-to-left,android,localization 来源: https://codeday.me/bug/20191027/1941457.html