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

4

我的应用支持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


你能解决这个问题吗? - user1506104
不,我没有解决这个问题。 - Ravers
1个回答

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>标签中,然后在您的Activities的onCreate()方法顶部添加以下行forceRTLIfSupported();,然后将下面的函数插入到您的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);


    }
}

输出:

enter image description here

注意:

如果以下条件成立,"start" 的意思是 "right":

  • 当前系统语言为RTL(阿拉伯语、希伯来语等)
  • 且Android设备的API版本为17或更高

更多信息:Android Dev

enter image description here

enter image description here


如果我的当前系统语言是RTL,我的应用程序会镜像导航栏... 我的问题是,如果我的系统语言是LTR,并且我想将我的语言(仅在应用程序中)更改为RTL。也许可以强制将getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 应用于我的导航栏,但仅适用于应用程序,而不是系统本身。我尝试了这个解决方案,但并没有得到我预期的结果。 - Ravers
请展示一下你现在的屏幕截图。 - Maveňツ
@Ravers 我猜这是不可能的,因为您正在动态更改语言,那么操作系统如何知道您想要在特定语言更改时使用RTL?您必须编写我发布的代码,当语言格式为RTL时,例如将语言环境更改为阿拉伯语,然后强制系统执行RTL,并在应用程序关闭时改回原始格式。谢谢。 - Maveňツ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接