以编程方式更改导航栏方向(RTL)
我的应用程序支持4种不同的语言,其中两种是从右到左书写的。
如果我从android系统更改语言然后启动我的应用程序,一切正常。 我得到一个镜像布局(RTL)甚至导航栏都是镜像的。
我的问题是我的应用程序中有一个按钮来更改语言。 要以编程方式更改Locale,我这样做:
Locale locale = new Locale("ar") Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
然后重新创建活动:
this.recreate();
活动是从RTL重新创建的,但导航栏保留旧样式(未镜像):
是否可以通过编程方式镜像导航栏?
编辑(添加图像):
如果我改变系统语言,一切正常:
如果我以编程方式更改语言,则导航栏不会更改:
从Android 4.2.2( API Level 17 )开始,它本身支持RTL。
当您以实际方式更改语言时,操作系统如何知道您希望RTL对特定语言进行更改。 语言为RTL格式时。 比如当您将语言环境更改为阿拉伯语然后强制系统执行RTL时,应用程序关闭后再更改回原始格式。
要强制整个布局为RTL(包括导航栏方向(RTL)),请执行以下操作。 编辑你的AndroidManifest.xml
并添加android:supportsRtl="true"
...
到您的
标签,然后forceRTLIfSupported();
添加到您的活动的顶部onCreate()
方法forceRTLIfSupported();
然后将follow函数插入到Activity中。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void forceRTLIfSupported() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){ //HERE CHECK CONDITION FOR YOUR LANGUAGE if it is AR then //change if it is english then don't getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); } }
输出:
注意:
具体而言,“开始”意味着“正确”,如果:
- 目前的系统语言是RTL (阿拉伯语,希伯来语……)
- 并且Android设备是API 17或更高版本
更多信息: Android Dev