59

すべての RTL 言語に対して言語コードをテストする以外に、RTL (右から左) 言語を識別する方法はありますか?

API 17+ では RTL と LTR に複数のリソースを使用できるため、少なくとも API 17 からは方法があるはずです。

4

16 に答える 16

80

Configuration.getLayoutDirection()から取得します。

Configuration config = getResources().getConfiguration();
if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
    //in Right To Left layout
}
于 2013-09-25T04:37:46.413 に答える
54

@cyanideの答えには正しいアプローチがありますが、重大なバグがあります。

Character.getDirectionality は、双方向 (bidi) 文字タイプを返します。左から右へのテキストは予測可能なタイプ L であり、右から左へのテキストも予測可能なタイプ R です。ただし、アラビア語のテキストは別のタイプ、タイプ AL を返します。

タイプ R とタイプ AL の両方のチェックを追加し、Android に付属するすべての RTL 言語 (ヘブライ語 (イスラエル)、アラビア語 (エジプト)、アラビア語 (イスラエル)) を手動でテストしました。

ご覧のとおり、これは他の右から左への言語を除外しているため、Android がこれらの言語を追加するときに、同様の問題が発生し、すぐに気付かない可能性があることを懸念していました。

そこで、各 RTL 言語を手動でテストしました。

  • アラビア語 (العربية) = タイプ AL
  • クルド語 (کوردی) = タイプ AL
  • ペルシア語 (frosis) = タイプ AL
  • ウルドゥー語 (اردو) = タイプ AL
  • ヘブライ語 (עברית) = タイプ R
  • イディッシュ語 (שדדש) = タイプ R

したがって、これはうまくいくはずです:

public static boolean isRTL() {
    return isRTL(Locale.getDefault());
}

public static boolean isRTL(Locale locale) {
    final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0));
    return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT ||
           directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
}

正しい方向を送ってくれてありがとう@cyanide!

于 2014-04-21T18:44:37.363 に答える
24

サポート ライブラリを使用している場合は、次の操作を実行できます。

if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL) {
    // The view has RTL layout
} else {
    // The view has LTR layout
}
于 2015-02-17T18:54:33.240 に答える
16

サポート ライブラリのTextUtilsCompatを使用できます。

TextUtilsCompat.getLayoutDirectionFromLocale(locale)

于 2016-05-19T08:56:52.867 に答える
9

ビューのレイアウト方向を確認する非常に簡単な方法がありますが、API 17 より前のデバイスでは LTR にフォールバックします。

ViewUtils.isLayoutRtl(View view);

ViewUtils クラスはサポート v7 ライブラリにバンドルされているため、appcompat ライブラリを使用している場合は既に利用可能になっているはずです。

于 2015-08-06T10:17:16.850 に答える
3

LTR モードと RTL モードの両方でアプリの UI をより正確に制御するために、Android 4.2 には View コンポーネントの管理に役立つ次の新しい API が含まれています。

android:layoutDirection — attribute for setting the direction of a component's layout.
android:textDirection — attribute for setting the direction of a component's text.
android:textAlignment — attribute for setting the alignment of a component's text.
getLayoutDirectionFromLocale() — method for getting the Locale-specified direction

したがって、 getLayoutDirectionFromLocale() が役立ちます。ここでサンプル コードを参照してください。

于 2013-09-25T05:18:36.283 に答える
2

ありがとうございます。

のコードを見るとLayoutUtil.getLayoutDirectionFromLocale()(そして、私Confuiguration.getLayoutDirection()も同様だと思います)、ロケール表示名の先頭文字をCharacter.getDirectionality.

Android 1 から出回っていたのでCharacter.getDirectionality、次のコードはすべての Android リリースと互換性があります (RTL を正しくサポートしていないものも含めて :)):

public static boolean isRTL() {
    return isRTL(Locale.getDefault());
}

public static boolean isRTL(Locale locale) {
     return
        Character.getDirectionality(locale.getDisplayName().charAt(0)) ==
            Character.DIRECTIONALITY_RIGHT_TO_LEFT; 
}
于 2013-09-26T01:57:13.593 に答える
1

これはすべての SDK で機能します。

private boolean isRTL() {
    Locale defLocale = Locale.getDefault();
    return  Character.getDirectionality(defLocale.getDisplayName(defLocale).charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT;
}
于 2014-02-27T09:23:32.530 に答える