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,第二个(事件)是一个希伯来字符串,第三个和第一个一样。

问题: 有时事件字符串包含希伯来语和英语的混合文本,abc-אבג然后所有文本的行为就像重力是左的(而不是像我在文本视图中定义的那样右),我的意思是向左缩进。

如何解决?

4

4 回答 4

15

当文本位于TextView. 这是一个更普遍的答案,既适用于基本/快乐的场景,也适用于其他更复杂的用例。

在某些情况下,混合语言文本将在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);
}

如果字符串中有一个 RTL 语言字符,这会将字符串转换为 RTL 并将其左对齐,否则回退到 LTR。如果您希望字符串是 RTL,即使它完全使用,比如英语(一种 LTR 语言),那么您可以使用TextDirectionHeuristics.RTL而不是TextDirectionHeuristics.ANYRTL_LTR.

这是在没有TextView. 有趣的是,正如文档所述,

另请注意,这些方向启发式对应于类中提供的相同类型的常量ViewsetTextDirection()例如TEXT_DIRECTION_RTL.

更新:

我刚刚发现BidiJava 中的类似乎做了类似的事情。查一下!

更多参考资料:

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 回答
9

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

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

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

于 2017-08-01T20:30:32.180 回答
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));
于 2017-12-13T16:44:39.213 回答