すべての RTL 言語に対して言語コードをテストする以外に、RTL (右から左) 言語を識別する方法はありますか?
API 17+ では RTL と LTR に複数のリソースを使用できるため、少なくとも API 17 からは方法があるはずです。
すべての RTL 言語に対して言語コードをテストする以外に、RTL (右から左) 言語を識別する方法はありますか?
API 17+ では RTL と LTR に複数のリソースを使用できるため、少なくとも API 17 からは方法があるはずです。
Configuration.getLayoutDirection()から取得します。
Configuration config = getResources().getConfiguration();
if(config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
//in Right To Left layout
}
@cyanideの答えには正しいアプローチがありますが、重大なバグがあります。
Character.getDirectionality は、双方向 (bidi) 文字タイプを返します。左から右へのテキストは予測可能なタイプ L であり、右から左へのテキストも予測可能なタイプ R です。ただし、アラビア語のテキストは別のタイプ、タイプ AL を返します。
タイプ R とタイプ AL の両方のチェックを追加し、Android に付属するすべての RTL 言語 (ヘブライ語 (イスラエル)、アラビア語 (エジプト)、アラビア語 (イスラエル)) を手動でテストしました。
ご覧のとおり、これは他の右から左への言語を除外しているため、Android がこれらの言語を追加するときに、同様の問題が発生し、すぐに気付かない可能性があることを懸念していました。
そこで、各 RTL 言語を手動でテストしました。
したがって、これはうまくいくはずです:
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!
サポート ライブラリを使用している場合は、次の操作を実行できます。
if (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL) {
// The view has RTL layout
} else {
// The view has LTR layout
}
サポート ライブラリのTextUtilsCompatを使用できます。
TextUtilsCompat.getLayoutDirectionFromLocale(locale)
ビューのレイアウト方向を確認する非常に簡単な方法がありますが、API 17 より前のデバイスでは LTR にフォールバックします。
ViewUtils.isLayoutRtl(View view);
ViewUtils クラスはサポート v7 ライブラリにバンドルされているため、appcompat ライブラリを使用している場合は既に利用可能になっているはずです。
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() が役立ちます。ここでサンプル コードを参照してください。
ありがとうございます。
のコードを見ると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;
}
これはすべての SDK で機能します。
private boolean isRTL() {
Locale defLocale = Locale.getDefault();
return Character.getDirectionality(defLocale.getDisplayName(defLocale).charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT;
}