以编程方式更改导航栏方向(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

在此处输入图像描述

在此处输入图像描述