web-dev-qa-db-ja.com

TextViewで重力にロケール(ltr / rtl)を使用する

LTRシステムロケールの場合はAndroid:gravity="left"、RTLシステムロケールの場合はAndroid:gravity="right"が必要な単純なTextViewがあります。

明らかな選択は次のようになります:Android:gravity="start"しかし、次に英語のテキストは常に左揃えで、ヘブライ語は右揃えになります。

Android:gravity="start"での表示は次のとおりです:

LTRロケール:

|          לורם|   // incorrect
|test           |  // correct

RTLロケール:

|          לורם|  // correct
|test           |  // incorrect

それはそのように見えるはずです:

LTRロケール:

|לורם           |  
|test            | 

RTLロケール:

|          לורם|  
|           test| 

変更されたxmlファイルでlayout-ldrtlフォルダーを使用せずにそれを行うことは可能ですか?多くのレイアウトファイルを2回編集する必要があるため、開発が非常に複雑になります...

編集: API 17+のソリューションで十分です。システムロケールを記述しましたが、実際には、ユーザーがアプリの言語を次のように変更できるようにしています。

Configuration configuration = context.getResources().getConfiguration();
configuration.setLayoutDirection(selectedLocale);
configuration.locale = selectedLocale;
context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());

したがって、このロケールがrtl <-> ltrの選択で考慮されるとすばらしいでしょう。

23
agrajag

私は現在このソリューションを使用しています。単純なxmlソリューションを使用したいと思いますが、これはこれまでのところ最小限に見えます。

if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
  if (DynamicLanguage.getLayoutDirection(getContext()) == View.LAYOUT_DIRECTION_RTL) {
    this.textView.setGravity(Gravity.RIGHT);
  } else {
    this.textView.setGravity(Gravity.LEFT);
  }
}
2
agrajag

私もこの問題を抱えていました、これらのプロパティをTextViewで使用できます

Android:textDirection="locale"
Android:textAlignment="gravity"

または単にstyles.xml `のベースアプリテーマに追加します

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="Android:textColorPrimary">@Android:color/white</item>
    <item name="Android:textColorSecondary">@Android:color/white</item>
    <item name="colorButtonNormal">@color/colorAccent</item>
    <item name="Android:textAlignment">gravity</item>
    <item name="Android:textDirection">locale</item>
    </style>`

それでうまくいきました。

54
atabouraya
Android:layout_width="match_parent"    
Android:textAlignment="viewStart"

テキストビューが親の幅に引き伸ばされている場合、要素の重力を変更する必要はありません。テキストをビューの開始位置に合わせるだけで、テキストはテキストの内容(ヘブライ語または西部)に関係なく、LTRまたはRTLの位置に移動します。

29
Mr. Fish

おそらく、そのための特別な拡張TextViewクラスが必要です。

public class LocaleAwareTextView extends TextView {
    public LocaleAwareTextView(Context context) {
        super(context);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }
    public LocaleAwareTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }

    public LocaleAwareTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT);
    }

}

...そして、このクラスをレイアウトで使用します。ロケールとすべての方向をその場で切り替えたい場合は、レイアウトをリロードする必要があります。

2
Alex Cohn