android : 约束布局支持RTL
android : is constraint layout support RTL
在 android Studio 的约束布局中支持 RTL 的最佳实践是什么,
或者我应该创建一个单独的布局,一个用于英语,另一个用于阿拉伯语?
英文版
阿拉伯语的预期布局
当我将设备语言从英语更改为阿拉伯语时的输出布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="@string/CourseName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView7"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="16dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
<Button
android:text="@string/enroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginEnd="16dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginRight="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Display2" />
</android.support.constraint.ConstraintLayout>
正如 CommonsWare 已经指出的那样,如果您计划支持 RTL 语言,您应该 rarely/never 使用 Left/Right,尤其是如果您的目标是 API 16+.
将您的 app:layout_constraintRight_toRightOf="parent"
替换为 app:layout_constraintEnd_toEndOf="parent"
等等。
右边结束,左边开始。
不幸的是,他们做得不对(或者,"End" ;-))。
在许多约束中,例如对父项的约束,Android Studio 在应该使用 "Start"/"End" 的地方使用 "Left"/"Right" 创建约束分别。它会导致 RTL 语言出现问题(每一种语言的字母表都是中东语)。
更糟糕的是:我什至还没有看到任何关于它的公开错误。
我的解决方案:关闭 Android Studio (这样它就不会在我编辑时跳转并尝试修复问题),然后,使用 Atom 和 RegExp (或 sed
命令),我小心地将“layout_constraintLeft_toLeftOf
”替换为“layout_constraintStart_toStartOf
”,将“layout_constraintRight_toRightOf
”替换为“layout_constraintEnd_toEndOf
”。
抱歉,还没找到更傻的东西:-(
备注
有了链接,情况就更糟了。 RTL 布局甚至不能很好地链接,也不能保持布局。
我在那种情况下的结论是回到旧的布局,直到 Google 为 RTL 语言提供成熟的支持... 毕竟,RTL 在 LTR 之前很久就存在了;-)
更新:即将找到解决方案
我向 Google 打开了一个错误。他们说会是 "Fixed in 2.4".
更新:
Marked as Fixed
Fixed in 2.4
2017 年 4 月 25 日
设计模式尚不支持 RTL 准则。
简单的解决方案 -
清理你的项目,这样你就没有生成的文件。
将所有 "Left" 替换为 "Start"
xml 个文件中 "End" 的所有 "Right"。
注意 - 区分大小写
就是这样!!
是的约束布局支持 RTL,但要使用 RTL,应使用 "start and end" 约束而不是 "left and right" 约束。
示例:
采用
app:layout_constraintEnd_toEndOf="parent"
代替
app:layout_constraintRight_toRightOf="parent"
AND
Use
应用程序:layout_constraintStart_toStartOf="parent"
代替
app:layout_constraintLeft_toLeftOf="parent"
在 android Studio 的约束布局中支持 RTL 的最佳实践是什么,
或者我应该创建一个单独的布局,一个用于英语,另一个用于阿拉伯语?
英文版
阿拉伯语的预期布局
当我将设备语言从英语更改为阿拉伯语时的输出布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="@string/CourseName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView7"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="16dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
<Button
android:text="@string/enroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginEnd="16dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginRight="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Display2" />
</android.support.constraint.ConstraintLayout>
正如 CommonsWare 已经指出的那样,如果您计划支持 RTL 语言,您应该 rarely/never 使用 Left/Right,尤其是如果您的目标是 API 16+.
将您的 app:layout_constraintRight_toRightOf="parent"
替换为 app:layout_constraintEnd_toEndOf="parent"
等等。
右边结束,左边开始。
不幸的是,他们做得不对(或者,"End" ;-))。
在许多约束中,例如对父项的约束,Android Studio 在应该使用 "Start"/"End" 的地方使用 "Left"/"Right" 创建约束分别。它会导致 RTL 语言出现问题(每一种语言的字母表都是中东语)。
更糟糕的是:我什至还没有看到任何关于它的公开错误。
我的解决方案:关闭 Android Studio (这样它就不会在我编辑时跳转并尝试修复问题),然后,使用 Atom 和 RegExp (或 sed
命令),我小心地将“layout_constraintLeft_toLeftOf
”替换为“layout_constraintStart_toStartOf
”,将“layout_constraintRight_toRightOf
”替换为“layout_constraintEnd_toEndOf
”。
抱歉,还没找到更傻的东西:-(
备注 有了链接,情况就更糟了。 RTL 布局甚至不能很好地链接,也不能保持布局。
我在那种情况下的结论是回到旧的布局,直到 Google 为 RTL 语言提供成熟的支持... 毕竟,RTL 在 LTR 之前很久就存在了;-)
更新:即将找到解决方案
我向 Google 打开了一个错误。他们说会是 "Fixed in 2.4".
更新:
Marked as Fixed
Fixed in 2.4
2017 年 4 月 25 日
简单的解决方案 - 清理你的项目,这样你就没有生成的文件。 将所有 "Left" 替换为 "Start" xml 个文件中 "End" 的所有 "Right"。 注意 - 区分大小写
就是这样!!
是的约束布局支持 RTL,但要使用 RTL,应使用 "start and end" 约束而不是 "left and right" 约束。
示例: 采用 app:layout_constraintEnd_toEndOf="parent" 代替 app:layout_constraintRight_toRightOf="parent"
AND
Use
应用程序:layout_constraintStart_toStartOf="parent" 代替 app:layout_constraintLeft_toLeftOf="parent"