2015-12-14 6 views
11

私は単純なTextViewを持っています。これはltrシステムロケールではandroid:gravity="left"、rtlシステムロケールではandroid:gravity="right"です。TextViewの重力のためにロケール(ltr/rtl)を使用

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

LTRロケール:

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

そのように見えることになっています:

LTRロケール:

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

RTLロケールここ

android:gravity="start"で、それがどのように見えるかです:

|לורם   | 
|test   | 

RTLロケール:

|   לורם| 
|   test| 

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

編集: API 17+の解決策で十分です。 は、私は、システムのロケールを書いたが、実際に私は、ユーザーがそのようなアプリの言語を変更することができている:

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

このロケールがRTL <ためと考えられるならばそれは素晴らしいことだ - > LTRの選択。

+1

英語のテキストは左から右にレンダリングされます。私は重力が始まると思います。 – Bhargav

+1

はい、まさに私の問題です。 RTLロケールが設定されているときにRTLを強制する方法はありますか? – agrajag

+1

がtextdirection属性を追加しようとしましたか?しかし、それは唯一のAPIの17 +私は – Bhargav

答えて

1

私は今、このソリューションを使用しています、私は単純な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); 
    } 
} 
3

おそらく、そのための特別な拡張の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); 
    } 

} 

を...そして、あなたのレイアウトでこのクラスを使用します。ロケールとすべての向きをオンザフライで切り替えるには、レイアウトをリロードする必要があります。

19

私はあなたがTextViewのでこれらのプロパティを使用することができ、あまりにもこの問題を抱えていました

android:textDirection="locale" 
android:textAlignment="gravity" 

か、単にのstyles.xmlにベースのAppテーマに追加 `

<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>` 

それは私のために働いた。

+1

ありがとう! textDirectionとtextAlignmentは私のためにほぼ完璧に機能します! (それは17+だけですが、この質問には問題ありません) –

12
android:layout_width="match_parent"  
android:textAlignment="viewStart" 

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

+1

ありがとう!これはwidthの 'match_parent'の場合に働く唯一の答えで、プログラムでrtl言語を設定しました – mohax

関連する問題