Java Android混合语言文本-带RTL和LTR文本的字符串上的BidiFormatter
我有一个带有自定义Java Android混合语言文本-带RTL和LTR文本的字符串上的BidiFormatter,java,android,locale,bidirectional,bidi,Java,Android,Locale,Bidirectional,Bidi,我有一个带有自定义视图的列表视图,其中我有一个文本视图: <TextView android:id="@+id/textViewItemTitle" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:gravity="right|center_horizontal" android:t
视图的列表视图
,其中我有一个文本视图
:
<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" />
其中第一个参数是time hh:mm:ss,第二个(event)是希伯来语字符串,第三个与第一个类似
问题:有时事件字符串包含希伯来语和英语的混合文本,如abc-אבג
那么所有文本的行为就像重力是向左的(而不是像我在文本视图中定义的那样向右),我的意思是向左缩进
如何解决这个问题?尝试添加到您的文本视图:
android:textDirection="anyRtl"
更多阅读:
当文本位于文本视图中时,接受的答案将起作用。这是一个更一般的答案,既适用于基本/快乐场景,也适用于其他更复杂的用例
有些情况下,混合语言文本将在TextView
内部以外的其他地方使用。例如,文本可以通过共享Intent
传递给Gmail或WhatsApp等。在这种情况下,必须使用以下类的组合:
正如文件中引用的,这些是
实用程序类[es],用于格式化文本,以便在可能相反的方向性上下文中显示,而不会出现混乱。上下文的方向性在格式化程序创建时设置,文本的方向性可以估计,也可以在已知时传入
例如,假设您有一个结合了英语和阿拉伯语的字符串
,您需要将文本
- 从右向左(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\u LTR
这是在没有TextView
的情况下处理混合方向文本的正确方法。有趣的是,正如文件所述
还要注意,这些方向试探法对应于视图
类中为setTextDirection()
提供的相同类型的常量,例如TEXT\u direction\u RTL
更新:
我刚刚发现Java中的类似乎做了类似的事情。查一查
更多参考资料:
1.
2.我也有同样的问题,我的目标是API 16
我的解决方案非常简单,我在字符串的开头添加了“\u200F”
“\u200F”=Unicode字符“从右到左标记”(U+200F)以下代码片段演示了如何使用Unicode标记()
也许你可以发布一个截图来说明。你检查了哪个系统?实现可能是OEM特定的。不幸的是,我无法发布屏幕截图,并且我在几个不同Android版本的设备上测试了thta。Android:textDirection只能用于API级别17+。解决了这个问题,但在使用SpannableString时它有冲突
String mixedLanguageText = ... // mixed-language text
if(BidiFormatter.getInstance().isRtlContext()){
Locale rtlLocale = ... // RTL locale
mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR);
}
String mixedLanguageText = ... // mixed-language text
newText = "\u200F" + mixedLanguageText;
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));