android之阿拉伯语适配及注意细节

  1. AndroidManifest.xml配置文件中的 标签下,配置元素 android:supportsRtl="true"。此时当系统语言切换的时候,你的 App 也会跟着切换 UI 布局为镜像后的效果。

若未增加该元素,在xml中切换语言时,会提示 增加后,可在xml文件中查看反转后的效果 2. 新增value-ar文件夹

把values/strings.xml文件复制到values-ar文件中,逐条翻译即可。

  1. 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"

  1. 返回icon、下一个icon等,要针对阿拉伯语新建一个文件夹,放镜像后的图片,规则如下:

mipmap-xhdpi->mipmap-ldrtl-xhdpi

drawable->drawable-ldrtl

最终镜像的图片要UI同事提供,临时修改看效果可以使用镜像图片的网站:www.lddgo.net/image/flip

  1. TextView、EditText:利用全局样式,在style.xml中定义,在xml里使用style="@style/xxx"即可
  • 1). TextView
xml 复制代码
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       ...
       <item name="android:textViewStyle">@style/TextViewStyle.TextDirection</item>
       ...
</style>
xml 复制代码
<style name="TextViewStyle.TextDirection" parent="android:Widget.TextView">
        <item name="android:textDirection">locale</item>
</style>
  • 2). EditText
xml 复制代码
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       ...
       <item name="editTextStyle">@style/EditTextStyle.Alignment</item>
       ...
</style>
xml 复制代码
<style name="EditTextStyle.Alignment" parent="@android:style/Widget.EditText">
        <item name="android:textAlignment">viewStart</item>
        <item name="android:gravity">start</item>
        <item name="android:textDirection">locale</item>
</style>
  1. 其他细节
  • 1).固定ltr,如阿拉伯语下的"99%"要从左到右展示,可在xml中使用
ini 复制代码
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参数

ini 复制代码
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即可

arduino 复制代码
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 及以上版本

github.com/Blankj/Andr...

11). RTL布局中出现双光标/光标截断的情形

在布局文件内加上如下两个属性即可:

ini 复制代码
android:textDirection="anyRtl"
android:textAlignment="viewStart"

若还未解决

1.可查看是否使用了android:textCursorDrawable="@null",若有,可尝试去掉该句。

2.在AndroidManifest.xml中查看当前App/Activity的主题,比较老的项目可能使用了android:Theme.NotitleBar/android:Theme.Light等轻量级主题,如下所示:

ini 复制代码
<style name="AppTheme" parent="android:Theme.Light"/>

可尝试修改为android:Theme.Material.Light/Theme.MaterialComponents.Light/ Theme.AppCompat.Light等类型的主题

ini 复制代码
<style name="AppTheme" parent="android:Theme.Material.Light"/> //项目的minSdkVersion设置为21或更高  
<style name="AppTheme" parent="Theme.MaterialComponents.Light"/> //要依赖material库: implementation 'com.google.android.material:material:1.4.0'  
<style name="AppTheme" parent="Theme.AppCompat.Light"/> //要依赖AppCompat库: implementation 'androidx.appcompat:appcompat:1.6.1'
相关推荐
IT猿手24 分钟前
2025最新智能优化算法:沙狐优化(Rüppell‘s Fox Optimizer,RFO)算法求解23个经典函数测试集,完整MATLAB代码
android·算法·matlab·迁移学习·优化算法·动态多目标优化·动态多目标进化算法
开发者如是说3 小时前
言叶是如何对文件进行端到端加密的
android·kotlin·swift
小李飞飞砖3 小时前
kotlin中的冷流和热流
android·开发语言·kotlin
HX4364 小时前
MP - Realm (not just realm)
android·ios·全栈
嘉小华4 小时前
Android 协程全景式深度解析:第一章 协程基础本质论
android
嘉小华4 小时前
Kotlin初始化全解析:深入理解对象创建的内部机制,避开常见陷阱
android
嘉小华4 小时前
Android 协程全景式深度解析:第二章 结构化并发全解
android
东风西巷6 小时前
ProCCD复古相机:捕捉复古瞬间
android·数码相机·智能手机·生活·软件需求
何盖(何松影)14 小时前
Android T startingwindow使用总结
android
小李飞飞砖16 小时前
Android 依赖注入框架详解
android