Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android混合语言文本-带RTL和LTR文本的字符串上的BidiFormatter_Java_Android_Locale_Bidirectional_Bidi - Fatal编程技术网

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));