世界上的大部分语言的书写方式都是从左到右,但是也有一些语言是从右到左(Right to Left,以下简称为 RTL )书写的,譬如阿拉伯语,希伯来语以及叙利亚语。虽然这些都是小语种,支持RTL能给当地用户更好的体验。

Google 官网得知,安卓在SDK17(4.2 Jelly Bean)版本的以上能原生的支持RTL,只需以下几个步骤就能实现。

  1. AndroidManifest.xmluses-sdk 标签中,将 targetSdkVersionminSdkVersion 设为 17 或以上。
  2. AndroidManifest.xmlapplication 标签中,加入 android:supportsRtl=”true”
  3. 在布局xml文件中,将所有的 leftright 分别改为 startend,比如 android:paddingLeft 改为 android:paddingStart
  4. 由于startend 是安卓4.2以后才支持的,如果应用还要支持安卓4.2以下的旧设备,则须在保留 leftright 的基础上加入 startend,例如同时保留 android:paddingLeftandroid:paddingStart

如果你是用 Android Studio 的话,只需从 Refactor 菜单选项里点 Add RTL Support where possible 就可以一步到位完全上列操作。

同学们你以为这样就结束的话就 too young too naive 了,安卓的套路大家都知道,哪能这么容易放过码农的?让我们继续。

安卓的 RTL 引擎会自动将水平布局的排列颠倒,让 UI 控件的排列顺序变为从右到左,如图所示。

android rtc功能 安卓rtl_移动开发

请注意该图中的图标没有左右翻转,虽然看来也没有什么问题,但是如果我们换一个有方向性的图标呢?请看下图。

android rtc功能 安卓rtl_ui_02

这样看起来就有点不对,后退键的方向应该指向右边才是,像这种情况我们只能手动加入镜像图片,并用 ldrtl 后缀告之。假设后退键的图片资源是放在 /res/drawable/ic_back.xml ,它的镜像图片的路径就为 /res/drawable-ldrtl/ic_back.xml

android rtc功能 安卓rtl_android_03

不仅仅是图片,我们也可以用 ldrtl 后缀定义在RTL模式下的其它资源,比如颜色,布局和字符串等。

当安卓设备的语言设置是任何RTL语言的时候,设备默认的全局布局将自动变为 RTL。同学们也许会问,我不懂阿拉伯语,可以在测试环境下把布局改成 RTL 来方便开发吗?在开发者设定里就有这个选项,选项的名称和位置因机而异,在我的手机上是叫做 Force RTL layout direction

如果你的应用提供更该语言的选项,那么就要注意在更改语言的同时也要调整合适的布局。这里就可以用 SDK 17的 Configuration 有一个新的API,使用方法如下。

Locale locale = getLocale();
Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
config.locale = locale;
if (Build.VERSION.SDK_INT >= 17) {
   config.setLayoutDirection(locale);
}
resources.updateConfiguration(config, resources.getDisplayMetrics());

getLocale() 返回的是一个 RTL 布局的语言时(如阿拉伯语),config.setLayoutDirection(locale) 将把应用的全局布局方向更新为 RTL 来显示该语言。