Android混合语言文本 - 带有RTL和LTR文本的String上的BidiFormatter

时间:2013-12-09 14:57:44

标签: java android locale bidirectional bidi

我有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,second(event)是希伯来字符串,第三个是第一个。

问题:有时候事件String包含希伯来语和英语的混合文本,如abc-אבג,那么所有文本都表现得像重力一样(并且不像我定义的那样)文本视图),我的意思是向左缩进。

如何解决?

4 个答案:

答案 0 :(得分:6)

尝试添加到TextView:

android:textDirection="anyRtl"

更多阅读: http://developer.android.com/reference/android/view/View.html#attr_android:textDirection

答案 1 :(得分:6)

当文本位于TextView时,接受的答案将完成。这是一个更通用的答案,适用于基本/快乐场景和其他更复杂的用例。

在某些情况下,混合语言文本将用于TextView内的其他位置。例如,文本可以在共享Intent中传递到Gmail或WhatsApp,依此类推。在这种情况下,您必须使用以下类的组合:

正如文档中引用的那样......

  

实用程序类[es]用于格式化文本以便在可能相反的方向性上下文中显示而不会出现乱码。上下文的方向性是在格式化程序创建时设置的,文本的方向性可以在已知时估计或传递。

例如,假设您有一个String,其中包含英语和英语的组合。阿拉伯语,你需要文字

  • 从右向左 (RTL)。
  • 始终 右对齐 ,即使句子以英文开头。
  • 英语&amp;阿拉伯语单词的顺序正确,没有乱花。

然后您可以使用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并将其对齐到左侧,否则将回退到LTR。如果你希望字符串是RTL,即使它完全在里面,比如英语(LTR语言),那么你可以使用TextDirectionHeuristics.RTL而不是TextDirectionHeuristics.ANYRTL_LTR

这是在没有TextView的情况下处理混合方向文本的正确方法。有趣的是,正如文档所述,

  

另请注意,这些方向启发式对应于View的{​​{1}}类中提供的相同类型的常量,例如setTextDirection()

<强>更新

我刚刚在Java中发现了Bidi类似乎做了类似的事情。查一查!

进一步参考:

1。 Write text file mix between arabic and english

2。 Unicode Bidirectional Algorithm

答案 2 :(得分:3)

我遇到了同样的问题,我的目标是API 16 我的解决方案非常简单,我添加到字符串“\ u200F”的开头

String mixedLanguageText = ... // mixed-language text
newText = "\u200F" + mixedLanguageText;

“\ u200F”= Unicode字符'右转左标记'(U + 200F)

答案 3 :(得分:0)

以下代码段演示了如何使用unicodeWrap():

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(R.string.did_you_mean,
        myBidiFormatter.unicodeWrap(mySuggestion));