我的应用程序支持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重新创建的,但导航栏保留旧样式(未镜像):
是否可以通过编程方式镜像导航栏?
编辑(添加图片):
如果我改变系统语言,一切正常:
如果我以编程方式更改语言,则导航栏不会更改:
答案 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);
}
}
输出:
注:
具体而言,“开始”在以下情况下表示“正确”: