10

私はListViewカスタムViewを持っていますTextView

 <TextView
     android:id="@+id/textViewItemTitle"
     android:layout_width="0dp"
     android:layout_weight="1"
     android:layout_height="wrap_content"
     android:gravity="right|center_horizontal"
     android:text="title" />

これTextViewにはヘブライ語のテキストが含まれています。

 if(!bidi.isRtl(event)){
     event = bidi.unicodeWrap(event);
 }

 holder.title.setText(String.format("%s  %s  %s", bidi.unicodeWrap(item.getStartTimeNoDate().trim()), event,
 bidi.unicodeWrap(item.getDuration().trim())));

最初の引数は時間 hh:mm:ss で、2 番目 (イベント) はヘブライ語の文字列で、3 番目は最初の引数と同じです。

問題: イベント文字列にヘブライ語と英語の混合テキストが含まれる場合がありabc-אבג、すべてのテキストが重力が左のように動作します (テキスト ビューで定義したように右ではありません)。つまり、左にインデントされます。

それを解決する方法は?

4

4 に答える 4

15

受け入れられた回答は、テキストがTextView. これはより一般的な答えであり、基本的なシナリオとハッピー シナリオの両方に適用でき、その他のより複雑なユース ケースにも適用できます。

混合言語のテキストが 以外の場所で使用される場合がありTextViewます。たとえば、テキストは共有Intentで Gmail や WhatsApp などに渡される場合があります。このような場合、次のクラスを組み合わせて使用​​する必要があります。

ドキュメントで引用されているように、これらは...

文字化けすることなく、潜在的に反対方向のコンテキストで表示するためにテキストをフォーマットするためのユーティリティクラス。コンテキストの方向性はフォーマッタの作成時に設定され、テキストの方向性は推定されるか、既知の場合に渡されます。

たとえば、String英語とアラビア語を組み合わせた があり、テキストを

  • 右から左(RTL)。
  • 文が英語で始まる場合でも、常に右揃えになります。
  • 正しい順序で、文字化けのない英語とアラビア語の単語。

unicodeWrap()次に、次の方法を使用してこれを実現できます。

String mixedLanguageText = ... // mixed-language text

if(BidiFormatter.getInstance().isRtlContext()){
    Locale rtlLocale = ... // RTL locale
    mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR);
}

これにより、文字列が RTL に変換され、文字列に RTL 言語の文字が 1 つでも含まれていれば左揃えになり、それ以外の場合は LTR にフォールバックします。文字列が完全に英語 (LTR 言語) であっても RTL にしたい場合は、TextDirectionHeuristics.RTL代わりに. を使用できますTextDirectionHeuristics.ANYRTL_LTR

これは、 が存在しない場合に混合方向のテキストを処理する適切な方法ですTextView。興味深いことに、ドキュメントに記載されているように、

また、これらの方向ヒューリスティックは、 などの のViewクラスで提供される同じタイプの定数に対応していることにも注意してください。setTextDirection()TEXT_DIRECTION_RTL

アップデート:

Bidi私はJavaで似たようなことをしているように見えるクラスを見つけました。調べる!

さらなる参考文献:

1. アラビア語と英語を混ぜたテキスト ファイルを作成します

2. Unicode 双方向アルゴリズム

于 2016-11-15T05:38:29.720 に答える
13

TextView に追加してみてください:

android:textDirection="anyRtl"

詳細については、http://developer.android.com/reference/android/view/View.html#attr_android: textDirectionを参照してください。

于 2014-01-05T14:08:44.190 に答える