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"