世界上的大部分语言的书写方式都是从左到右,但是也有一些语言是从右到左(Right to Left,以下简称为 RTL )书写的,譬如阿拉伯语,希伯来语以及叙利亚语。虽然这些都是小语种,支持RTL能给当地用户更好的体验。
从 Google 官网得知,安卓在SDK17(4.2 Jelly Bean)版本的以上能原生的支持RTL,只需以下几个步骤就能实现。
- 在 AndroidManifest.xml 的 uses-sdk 标签中,将 targetSdkVersion 或 minSdkVersion 设为 17 或以上。
- 在 AndroidManifest.xml 的 application 标签中,加入
android:supportsRtl=”true”
。 - 在布局xml文件中,将所有的
left
和right
分别改为start
和end
,比如android:paddingLeft
改为android:paddingStart
。 - 由于
start
和end
是安卓4.2以后才支持的,如果应用还要支持安卓4.2以下的旧设备,则须在保留left
和right
的基础上加入start
和end
,例如同时保留android:paddingLeft
和android:paddingStart
。
如果你是用 Android Studio 的话,只需从 Refactor 菜单选项里点 Add RTL Support where possible 就可以一步到位完全上列操作。
同学们你以为这样就结束的话就 too young too naive 了,安卓的套路大家都知道,哪能这么容易放过码农的?让我们继续。
安卓的 RTL 引擎会自动将水平布局的排列颠倒,让 UI 控件的排列顺序变为从右到左,如图所示。
请注意该图中的图标没有左右翻转,虽然看来也没有什么问题,但是如果我们换一个有方向性的图标呢?请看下图。
这样看起来就有点不对,后退键的方向应该指向右边才是,像这种情况我们只能手动加入镜像图片,并用 ldrtl
后缀告之。假设后退键的图片资源是放在 /res/drawable/ic_back.xml
,它的镜像图片的路径就为 /res/drawable-ldrtl/ic_back.xml
。
不仅仅是图片,我们也可以用 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 来显示该语言。