我有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-אבג
,那么所有文本都表现得像重力一样(并且不像我定义的那样)文本视图),我的意思是向左缩进。
如何解决?
答案 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
,其中包含英语和英语的组合。阿拉伯语,你需要文字
然后您可以使用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
类似乎做了类似的事情。查一查!
进一步参考:
答案 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));