android之阿拉伯语适配及注意细节
1. AndroidManifest.xml配置文件中的 标签下,配置元素 android:supportsRtl="true"。此时当系统语言切换的时候,你的 App 也会跟着切换 UI 布局为镜像后的效果。
若未增加该元素,在xml中切换语言时,会提示 增加后,可在xml文件中查看反转后的效果 2. 新增value-ar文件夹
把values/strings.xml文件复制到values-ar文件中,逐条翻译即可。
- layout中的Left/Right修改为Start/End
可使用Android Studio中自带的工具:“工具栏”-“Refactor”-“Add right-to-Left(RTL)Support”
注意事项:
- 1).此时会把所依赖gradle里的xml文件列出,记得删除,不要转换。
- 2). 该工具只适用于项目的app模块,无法直接应用于依赖模块。如果需要在依赖模块中进行RTL转换,要逐个打开并手动进行相应的修改。
- 3). Start属性在LTR中对应Left,End属性在LTR中对应Right,在API 17开始支持,为了兼容低版本,可以同时有Left和Start。
即在“Add right-to-Left(RTL)Support”工具中,不勾选“Replace Left/Right Properties with Start/End Properties”
- 返回icon、下一个icon等,要针对阿拉伯语新建一个文件夹,放镜像后的图片,规则如下:
mipmap-xhdpi->mipmap-ldrtl-xhdpi
drawable->drawable-ldrtl
最终镜像的图片要UI同事提供,临时修改看效果可以使用镜像图片的网站:http://www.lddgo.net/image/flip
- TextView、EditText:利用全局样式,在style.xml中定义,在xml里使用style=”@style/xxx”即可
- 1). TextView
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:textViewStyle">@style/TextViewStyle.TextDirectionitem>
...
style>
<style name="TextViewStyle.TextDirection" parent="android:Widget.TextView">
<item name="android:textDirection">localeitem>
style>
- 2). EditText
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="editTextStyle">@style/EditTextStyle.Alignmentitem>
...
style>
<style name="EditTextStyle.Alignment" parent="@android:style/Widget.EditText">
<item name="android:textAlignment">viewStartitem>
<item name="android:gravity">startitem>
<item name="android:textDirection">localeitem>
style>
- 其他细节
- 1).固定ltr,如阿拉伯语下的“99%”要从左到右展示,可在xml中使用
android:layoutDirection ="ltr"
- 2).获取当前系统语言Locale.getDefault().getLanguage()
判断是否为阿拉伯语:"ar".equals(Locale.getDefault().getLanguage())
判断是否为英语:"en".equals(Locale.getDefault().getLanguage())
- 3). drawable/xxx_selector.xml中item里有android:drawable,如勾选框。
drawable有android:autoMirrored属性,将selector的该属性设置为true,就可以让drawable在RTL布局下进行反转
- 4).进度条的默认进度指示是从左到右,使用leftMargin;在阿拉伯语下,进度指示从右到左,使用rightMargin属性
- 5).阿拉伯语环境下,使用SimpleDateFormat格式化时间字符串的时候,会显示为:٢٠١٥-٠٩-١٨ ٠٧:٠٣:٤٩。若要展示:2023-09-067:10:45,可以使用Locale.ENGLISH参数
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
Date now=new Date();
System.out.println(sdf .format(now));
- 6). 加载html可用 tv.setText(Html.fromHtml(getResources().getString(R.String.xxx));
- 7). 开机导航中设置了阿拉伯语,当前页面布局要刷新,可以重写activity的onConfigurationChanged()方法,如在该方法里重置下一步箭头、指示器样式等
- 8).ViewPager
若是ViewPager,可使用第三方控件RtlViewPager替换: 521github.com/diego-gomez…,添加依赖,单纯替换原ViewPager即可
implementation 'com.booking:rtlviewpager:1.0.1'
类似三方控件: 521github.com/duolingo/rt…
或者使用androidx的ViewPager2替换: developer.android.google.cn/jetpack/and…,支持RTL布局
- 9). 固定RTL字符串的顺序
问题现象:EditText带hint,密码可见、不可见时,会调用如下方法进行设置
此时会影响hint的展示:在勾选时,hint的结束字符在右侧;不勾选时,hint的结束字符在左侧。
解决方法:此时要使用Unicode控制字符来限制整个字符串的显示方向:\u202B 和 \u202C。
有以下两种方法
a. java代码
b. strings.xml
最终效果:
10). Blankj的toast展示异常
android工具类Blankj的toast工具类在展示阿拉伯语时为空或者部分展示,建议使用1.30.6 及以上版本
11). RTL布局中出现双光标/光标截断的情形
在布局文件内加上如下两个属性即可:
android:textDirection="anyRtl"
android:textAlignment="viewStart"
若还未解决
1.可查看是否使用了android:textCursorDrawable=“@null”,若有,可尝试去掉该句。
2.在AndroidManifest.xml中查看当前App/Activity的主题,比较老的项目可能使用了android:Theme.NotitleBar/android:Theme.Light等轻量级主题,如下所示: