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言語のサポートを計画している場合、特にAPI 16以降をターゲットにしている場合は、まれに/決して左/右を使用する必要があります。
app:layout_constraintRight_toRightOf="parent"
をapp:layout_constraintEnd_toEndOf="parent"
などに置き換えます。
右に終了、左に開始。
残念ながら、彼らはそれを正しく行いません(または、「終了」;-))。
親への制約など、多くの制約では、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にバグを公開しました。彼らはそれが「2.4で修正される」と言います。
更新:
---(修正済みとしてマーク
2.4で修正
2017年4月25日
はい、制約レイアウトはRTLをサポートしていますが、RTLを使用するには、「左右」の制約の代わりに「開始と終了」の制約を使用する必要があります。
例:app:layout_constraintRight_toRightOf = "parent"の代わりにapp:layout_constraintEnd_toEndOf = "parent"を使用します
AND
Use
app:layout_constraintLeft_toLeftOf = "parent"の代わりにapp:layout_constraintStart_toStartOf = "parent"