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

Java 以编程方式更改导航栏方向(RTL),java,android,right-to-left,navigationbar,Java,Android,Right To Left,Navigationbar,我的应用程序支持4种不同的语言,其中两种是从右到左编写的 如果我从android系统更改语言,然后启动我的应用程序,一切正常。我得到了镜像布局(RTL),甚至导航栏也是镜像的 我的问题是,我的应用程序中有一个按钮可以更改语言。 要以编程方式更改区域设置,我将执行以下操作: Locale locale = new Locale("ar") Locale.setDefault(locale); Configuration config = new Configuration(); config.lo

我的应用程序支持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重新创建的,但导航栏保留了旧样式(未镜像):

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

编辑(添加图像):

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

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

来自Android 4.2.2(),本机支持RTL

当您以实用的方式更改语言时,操作系统如何知道您需要特定语言更改的RTL。当语言为RTL格式时。例如,当您将语言环境更改为阿拉伯语,然后强制系统执行RTL,当应用程序关闭后,再更改回原始形式

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

输出:

注:

具体而言,“开始”是指“正确”,如果:

  • 当前的系统语言是RTL(阿拉伯语、希伯来语…)
  • android设备的API 17或更高版本
更多信息:


如果我当前的系统语言是RTL,我的应用程序将镜像导航栏。。。我的问题是,如果我的系统语言是LTR,并且我想将我的语言(仅在应用程序中)更改为RTL。可能会强制执行getWindow().getDecorView().setLayoutDirection(View.LAYOUT\u DIRECTION\u RTL);到我的导航栏,但只针对应用程序,而不是系统本身。我尝试了这个解决方案,但没有达到我预期的效果。显示屏幕截图,看看你现在是如何得到的?@Ravers我想这是不可能的,因为你正在务实地改变语言,所以操作系统如何知道你想要在特定的语言改变上使用RTL,你必须编写我发布的代码。。当语言为RTL格式时。例如,当您将语言环境更改为阿拉伯语,然后强制系统执行RTL,当应用程序关闭后,再更改回原始形式。谢谢你能解决这个问题吗?不,我没解决这个问题。
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
...
</application>
@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);


    }
}