Android阿拉伯语UI适配问题汇总
Sensi Sun
RTL和LTR
LTR 是 Left-to-right(从左向右) 的缩写。(常用)
RTL 是 Right-to-left(从右向左) 的缩写。其意为人们书写阅读习惯是从右向左,朝左继续的。常见的RTL语言有阿拉伯语,希伯来语等。
从 Android 4.2 即 SDK 17 开始,提供了全面的本地布局支持,允许镜像布局,可以同时支持 RTL 和 LTR。
阿拉伯语适配方法AndroidManifest.xml文件配置
在 AndroidManifest.xml 文件中 application 节点添加支持从右到左布局方式代码。
...
android:supportsRtl="true">
...
切换语言
AS一键适配
AS 支持一键适配 RTL,主要是在原来 Layout 中设置 Left 和 Right 属性的补充添加 Start 和 End 属性。Start 属性在 LTR 中对应 Left,在 RTL 中对应 Right,在API 17开始支持,为了兼容低版本,需要同时有 Left 和 Start。
Refactor > Add RTL Support Where Possible...
添加Start 和 End 属性有两种方法:
方法一:手动在原来 Layout 中设置 Left 和 Right 属性的补充添加 Start 和 End 属性。
风险分析:暂无。
方法二:导入第三方插件。
名称
描述
自动修复布局文件中未添加RTL支持的标签
与 AS 插件的比较:
性能更好。在处理大批量文件修改时,用AS工具会出现卡顿;
支持padding标签的补齐。
风险:可能会出现部分布局文件未添加RTL支持的标签。
【配置】
buildscript{
repositories {
// ...
maven { url"https://jitpack.io"}
}
dependencies {
classpath'com.github.znyang:gradle-android-rtl:0.0.4'
}
}
applyplugin:'com.zen.plugin.rtl'
rtl{
from=fileTree("${project.projectDir}/src/main/res/layout/")
// into = "${project.buildDir}/outputs/rtl/res/layout"
}
【输出】
gradle androidRtl
需要修复的layout文件会生成在rtl.into的目录下,可以在确认后覆盖到你的layout目录下,再进行一遍检查!
注:未定义rtl.into的情况下,修复的文件会直接覆盖原文件!
支持的标签如下:
{
"layout_toLeftOf", "layout_toStartOf",
"layout_toRightOf", "layout_toEndOf",
"layout_marginLeft", "layout_marginStart",
"layout_marginRight", "layout_marginEnd",
"layout_alignLeft", "layout_alignStart",
"layout_alignRight", "layout_alignEnd",
"layout_alignParentLeft", "layout_alignParentStart",
"layout_alignParentRight", "layout_alignParentEnd",
"drawableLeft", "drawableStart",
"drawableRight", "drawableEnd",
}
// padding只要存在left/right,就会补充四个标签
{
"paddingLeft", "paddingStart",
"paddingRight", "paddingEnd"
}
// 支持对以下标签的value替换(left->start, right->end)
{
"layout_gravity",
"gravity"
}
【如何验证修复完善?】
Android>Lint>Internationalization>Bidirectional Text
4.使用全局样式
EditText
EditText 控件基本都需要设置下面两个属性:
android:textAlignment="viewStart"
android:gravity="start"
可以在 style.xml 样式中全部 EditText 都设置:
TextView
全局给所有 TextView 添加一个 RTL 属性
【判断是否是 RTL 布局】
TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == LayoutDirection.RTL
ViewPager
Android 官方控件大多支持 RTL,ViewPager 除外。
菜单栏的图标处理
图标处理:
方法一:图标做两套,放在不同的文件夹里,切换语言和阿拉伯语适配的时候,进行图标的变更;
方法二:图标保持不变,切换的时候,直接将图标右移,图标位置保持不变。
附:
插件:AndroidLocalizationer(实现语言国际化,支持30多种语言,可以实现词条strings.XML文件的转换。)
文档还在完善中,欢迎大家提出问题,交流分享!
本文地址:https://blog.youkuaiyun.com/renus_sun/article/details/86639208