以编程方式更改导航栏方向(RTL)

时间:2016-12-07 13:04:27

标签: java android right-to-left navigationbar

我的应用程序支持4种不同的语言,其中两种是从右到左书写的。

如果我从android系统更改语言然后启动我的应用程序,一切正常。我得到一个镜像布局(RTL)甚至导航栏都是镜像的。

我的问题是我的应用程序中有一个按钮来更改语言。 要以编程方式更改区域设置,请执行以下操作:

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重新创建的,但导航栏保留旧样式(未镜像):

navigation bar

是否可以通过编程方式镜像导航栏?

编辑(添加图片):

如果我改变系统语言,一切正常:

right

如果我以编程方式更改语言,则导航栏不会更改:

wrong

1 个答案:

答案 0 :(得分:1)

从Android 4.2.2(API Level 17)开始,它本身支持RTL。

  

当您实际更改语言时,操作系统如何知道您希望RTL对特定语言进行更改。语言为RTL格式时。比如当您将语言环境更改为阿拉伯语然后强制系统执行RTL时,应用程序关闭后再更改回原始格式。

要强制整个布局为RTL,包括导航栏方向(RTL),请执行以下操作。修改您的AndroidManifest.xml并添加android:supportsRtl="true"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
...
</application>

到您的<application>标记,然后将以下行添加到您的活动“onCreate()方法forceRTLIfSupported();的顶部,然后将以下函数插入您的活动中。

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


    }
}

输出:

enter image description here

注:

具体而言,“开始”在以下情况下表示“正确”:

  • 当前的系统语言是RTL (阿拉伯语,希伯来语......)
  • 并且Android设备是 API 17或更高版本

更多信息:Android Dev

enter image description here

enter image description here