您现在的位置是:首页 > 正文

Android RTL布局适配

2024-01-30 22:49:41阅读 0

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

RTL布局是什么

RTL与LTR效果对比图

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

RTL布局适配

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

...
<application
        android:supportsRtl="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">0</integer>
</resources>

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

<resources>
    <integer name="rotation">180</integer>
</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"

    没设置该属性时的显示效果:
    这里写图片描述
    设置后效果:
    这里写图片描述

RTL布局测试

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

网站文章

  • Java集合之ArrayList和LinkedList

    Java集合之ArrayList和LinkedList

    Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set ...

    2024-01-30 22:49:33
  • 08 JavaScript

    08 JavaScript

    1. 基本介绍1.JavaScript是一种专门在浏览器编译并执行的编程语言2.JavaScript处理用户与浏览器之间请求问题3.JavaScript采用【弱类型编程语言风格】对【面向对象思想】来进...

    2024-01-30 22:49:26
  • Ant Counting(多重背包计数 + 优化)

    Ant Counting(多重背包计数 + 优化)

    Ant Counting 题目 t种蚂蚁,总共n只,从中挑出i只,求从中挑出l只到r只的所有挑法。 思路 显然是dp , 定义dp为从前i只挑出j只的方案集合,记录它的数量count。 状态转移是从 ...

    2024-01-30 22:48:59
  • logStash导出elasticsearch数据

    需求:要分析es库中存储的数据。 注:es存储数据是以文件形式存储的没有办法直接分析,需要把数据以.json文件形式的数据来进行分析。 环境:linux,logstash7.1.1,elasticse...

    2024-01-30 22:48:53
  • 设计模式之适配器模式(C++实现)

    设计模式之适配器模式(C++实现)

    适配器模式介绍,包括应用场景,优缺点,模式结构,类图 以及 C++代码示例

    2024-01-30 22:48:47
  • 安装kafka视图工具

    执行命令java -cp KafkaOffsetMonitor-assembly-0.2.0.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --zk 192.168.49.204:2181 --port 8888 --refresh 10.seconds --retain 2.days即可...

    2024-01-30 22:48:19
  • 【Spire.PDF】Spire.PDF破解 热门推荐

    【Spire.PDF】Spire.PDF破解 热门推荐

    用Spire.PDF生成报告时出现警告语 破解方法:删除第一个页 因为警告语只会在文档的第一页生成,所有删除文档第一页即可 PdfDocument pdfDocument = new PdfDocument(); pdfDocument.Pages.Add(); pdfDocument.Pages.RemoveAt(0); ...

    2024-01-30 22:48:12
  • 介绍下前端自动化工具grunt

    答:Grunt是一款基于Node.js的前端自动化构建工具,可以帮助开发者更轻松高效地完成日常的前端开发工作。它可以自动编译、合并、压缩和校验CSS和JavaScript,也可以在文件发生变化时自动重新加载页面,从而节省开发时间。...

    2024-01-30 22:48:06
  • 处理vue与后端的跨域问题

    处理vue与后端的跨域问题

    post和get请求该发送什么请求头

    2024-01-30 22:47:57
  • WSL安装Oracle Database 21c (RPM)

    wsl 安装 oracle database

    2024-01-30 22:47:28