首先需要在在Manifest 中通过添加 supportsRtl=true 来声明你的应用支持RTL。
supportsRtl="true" 的唯一作用是:
👉 允许系统在 RTL 语言下,把整个应用的 layoutDirection 从 LTR 切到 RTL
它 不做任何"自动镜像"之外的事 ,也 不会单独改变文字内容。
1️⃣ 没有 supportsRtl 会发生什么?
Kotlin
<application
android:supportsRtl="false">
或默认没写(默认就是 false)
当系统语言切到阿拉伯语 / 希伯来语时:
| 项目 | 结果 |
|---|---|
Locale.language |
ar |
Configuration.layoutDirection |
仍然是 LTR ❌ |
start / end |
按 left / right 处理 |
| 整体布局 | 不会镜像 |
写了 supportsRtl="true" 会发生什么?
Kotlin
<application
android:supportsRtl="true">
| 项目 | 结果 |
|---|---|
Locale.language |
ar |
Configuration.layoutDirection |
RTL ✅ |
start / end |
自动翻转 |
layout_marginStart |
变成右边 |
Gravity.START |
右对齐 |
3️⃣ 它到底"帮你干了什么"?
✅ 它只影响这一件事
是否允许系统把 layoutDirection 切为 RTL
更新语言代码
Kotlin
fun updateLanguage(context: Context?): Context? {
var newContext = context ?: return null
try {
val language = getLanguage()
val locale = Locale(language)
val resources = context.resources
val configuration = resources.configuration
configuration.setLocale(locale)
configuration.fontScale = 1f
newContext = context.createConfigurationContext(configuration)
val metrics = resources.displayMetrics
resources.updateConfiguration(configuration, metrics)
resources.flushLayoutCache()
} catch (e: Exception) {
logEForUtil(logTag, e)
}
return newContext
}
configuration.setLocale(locale)的里面会同时修改布局的方向
代码如下:
public void setLocales(@Nullable LocaleList locales) {
mLocaleList = locales == null ? LocaleList.getEmptyLocaleList() : locales;
locale = mLocaleList.get(0);
setLayoutDirection(locale); //修改布局
}