Android RTL布局适配

丈夫志四海,万里犹比邻。 —曹植《赠白马王彪》

RTL布局是什么

Android RTL布局适配_第1张图片

如上图所示,RTL(Right To Left)即视图的表现形式是从右开始向左结束。我们日常更习惯于LTR(Left To Right)视图,但在中东的阿拉伯语系里他们视觉习惯跟我们正好相反,他们更习惯从右向左的视觉形式。
最近公司开发的产品正好需要做RTL适配,本文总结分享在适配RTL过程中的技术要点。

RTL布局适配

1. 首先在AndroidManifest文件中添加支持

...
"true"
...

2. 替换资源文件中的xxxLeft/xxxRight为xxxStart/xxxEnd
在AS开发环境下,可以通过Refactor---->Add RTL support where possible 快速替换。需要注意的是替换完成后,最好在用grep命令搜索下xxxLeft/xxxRight,看是否有漏网之鱼。比如一些定义在style文件中的属性就有可能替换失败。

3. 反转某些图标
某些图标在RTL布局中,需要做反转,比如类似<-- 的图标在RTL布局中应该显示成-->, 首先可以让美工切一套专门针对RTL布局的图标,将其放在drawable-ldrtl目录下。或者通过设置android:autoMirrored="true",可惜前者会造成图片资源冗余,增大apk体积,而后者需要API等级在19以后才可以。

这里介绍一个比较通用的方案。通过xml去配置,可以在图标的属性中添加

android:rotationY="@integer/rotation"

然后在value/integer.xml声明如下:

<resources>
    <integer name="rotation">0integer>
resources>

最后在value-ldrtl/integer.xml声明如下:

<resources>
    <integer name="rotation">180integer>
resources>

4. 检查代码中动态设置的Margin/Padding
类似rightMargin这种的需要替换成setMarginEnd(end)

Gravity.LEFT/RIGHT替换成Gravity.START/END

setPadding(left, top, right, bottom) 替换成setPaddingRelative(start, top, end, bottom)
可以采用命令

git grep -E "\.rightMargin|\.leftMargin|Gravity\.LEFT|Gravity\.RIGHT|setMargin\(|setPadding\(" 

快速过滤出代码中可能需要修正的地方,然后在针对具体逻辑看是否需要修改。

5. 特殊控件适配

  • ViewPager
    可以使用开源控件https://github.com/duolingo/rtl-viewpager ,替换起来很方便。
    不过我在实践过程中发现结合TabLayout实现顶部指示标签,在RTL视图下,会出现标签挤压在一起。原因如下
public class RtlViewPager extends ViewPager {
        //这里初始化赋值,TabLayout初始化时使用了该值。
        private int mLayoutDirection = ViewCompat.LAYOUT_DIRECTION_LTR;
解决办法是:当判断是RTL视图模式,手动对ViewPager设置布局方式加以修正。
rtlViewPager.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
  • TextView
    RTL显示情况下,TextView文字内容为阿拉伯时,大部分情况下都能很好的适配,但如果文字内容非阿拉伯语时,对齐方式就会出现问题,因此需要加上下面的属性。

    android:textAlignment="viewStart"

    没设置该属性时的显示效果:
    Android RTL布局适配_第2张图片
    设置后效果:
    Android RTL布局适配_第3张图片

RTL布局测试

中东语言对大多数开发者来说都是天书般的文字,因此在查看适配后的效果时,可能不太方便。在Android系统的开发者选项里有一个强制采用RTL布局的选项,即使没有切换中东语言,也可以非常方便的观察效果。
Android RTL布局适配_第4张图片

你可能感兴趣的:(android)