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

Nic*_*ckF 5 java android locale bidi bidirectional

我有一个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" />
Run Code Online (Sandbox Code Playgroud)

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())));
Run Code Online (Sandbox Code Playgroud)

第一个参数是时间hh:mm:ss,second(event)是希伯来字符串,第三个是第一个.

问题: 有时候事件String包含希伯来语和英语的混合文本,就像abc-???所有文本的行为都像重力一样(并且不像我在文本视图中定义的那样),我的意思是向左缩进.

怎么解决?

Y.S*_*Y.S 10

当文本在文本中时,接受的答案将完成工作TextView.

可能存在混合语言文本不在a中显示的情况TextView.例如,文本可以在共享中传递Intent给Gmail或WhatsApp等.在这种情况下,您必须使用以下类的组合:

正如文档中引用的,这些是......

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

例如,假设你有一个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);
}
Run Code Online (Sandbox Code Playgroud)

如果字符串中只有一个RTL语言字符,则会将字符串转换为RTL并将其对齐到左侧,否则将回退到LTR.如果你想让字符串成为RTL,即使它完全在里面,比如英语(一种LTR语言),那么你可以使用TextDirectionHeuristics.RTL而不是TextDirectionHeuristics.ANYRTL_LTR.

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

还要注意的是,这些方向启发式对应于相同类型的所提供的常数的ViewsetTextDirection(),如TEXT_DIRECTION_RTL.

更新:

我刚刚发现BidiJava中的类似乎做了类似的事情.抬头看!

进一步参考:

1. 在阿拉伯语和英语之间编写文本文件组合.

2. Unicode双向算法.


ido*_*dog 7

尝试添加到TextView:

android:textDirection="anyRtl"
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问:http://developer.android.com/reference/android/view/View.html#attr_android: textDirection

  • android:textDirection只能用于API级别17+. (2认同)

tm8*_*m81 6

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

String mixedLanguageText = ... // mixed-language text
newText = "\u200F" + mixedLanguageText;
Run Code Online (Sandbox Code Playgroud)

“ \ u200F” = Unicode字符'RIGHT-TO-LEFT MARK'(U + 200F)