Android 混合语言文本 - 带 RTL 和 LTR 文本的字符串上的 BidiFormatter

2024-03-15

我有一个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" />

This 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-אבג那么所有文本的行为就像重力向左(而不是像我在文本视图中定义的那样),我的意思是向左缩进。

怎么解决呢?


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

在某些情况下,混合语言文本要在除内部之外的其他地方使用。TextView。例如,文本可以在共享中传递Intent到 Gmail 或 WhatsApp 等。在这种情况下,您必须使用以下类的组合:

  • BidiFormatter https://developer.android.com/reference/android/support/v4/text/BidiFormatter.html
  • TextDirectionHeuristics https://developer.android.com/reference/android/text/TextDirectionHeuristics.html

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

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

举例来说,假设您有一个String包含英语和阿拉伯语的组合,并且您需要文本

  • 右到左 (RTL).
  • always 右对齐,即使句子以英语开头。
  • 英语和阿拉伯语单词顺序正确且无乱码。

那么你可以使用以下方法来实现这一点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类为setTextDirection(), 例如TEXT_DIRECTION_RTL.

Update:

我刚刚找到了Bidi http://docs.oracle.com/javase/7/docs/api/java/text/Bidi.htmlJava 中的 class 似乎做了类似的事情。查一下!

更多参考:

1. 编写阿拉伯语和英语混合的文本文件 https://stackoverflow.com/a/24723273.

2. Unicode 双向算法 http://www.unicode.org/reports/tr9/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 混合语言文本 - 带 RTL 和 LTR 文本的字符串上的 BidiFormatter 的相关文章

  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • org.apache.commons.codec.digest.Md5Crypt.md5Crypt 函数。 linux下出现异常,windows下正常

    我们正在使用commons codec加密密码 使用org apache commons codec digest Md5Crypt md5Crypt功能 在Windows环境下工作正常 但在CentOS上却抛出异常 我们有3台centOS
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 片段活动中的 commitAllowingStateLoss()

    我的应用程序使用片段活动 它仅处于纵向模式 无法旋转屏幕 最初我使用的是commit 方法 但现在我计划不加区别地将这些更改为commitAllowingStateLoss 对于碎片活动 是否有任何理由不不加区别地执行此操作而不重新评估我使
  • 无法自动装配 org.springframework.mail.javamail.JavaMailSender

    尝试运行我的应用程序时遇到以下问题 所有的东西都调试过了 还是一无所获 IDE 毫无问题地找到了 bean 所以我对这里发生的情况感到非常困惑 SEVERE Exception sending context initialized eve
  • 两条腿的 OAuth 和 Gmail Atom feed

    我们正在尝试让 2 legged OAuth 与 Gmail Atom feed 一起使用 我们使用 John Kristian Praveen Alavilli 和 Dirk Ba lfanz 贡献的 Java 库 http oauth
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • 获取包中声明的所有 Java 类的名称

    我正在编写一个功能 它将有助于将类放入我的程序的某个包中 另外 我只想要子类某个类的类 我需要这些类才能调用它们的静态方法 有没有一种自动的方法来做到这一点 如果是的话 速度慢吗 如果我不清楚 我想要的是这样的 ArrayList
  • “___ 中的方法 ___() 是在无法访问的类或接口中定义的”编译错误

    我发现了一个奇怪的编译限制 我无法解释 并且我不明白这个限制的原因 示例1 考虑这些类 In package e1 public class C1 enum E1 A B C public E1 x In package e2 import
  • DialogFragment 关闭事件

    我需要处理 DialogFragment 的结尾 在调用 dismiss 之后 例如 我会在关闭后 包含 片段的活动内显示一个 toast 我该如何处理该事件 覆盖onDismiss 在你的DialogFragment中 或者使用setOn
  • onStart() 到底做了什么? - 安卓[重复]

    这个问题在这里已经有答案了 一段时间以来 我一直想知道 onStart 函数在 android 生命周期中的确切作用 网上的大多数资源只是说 它在您的活动在屏幕上可见之前被调用 但到目前为止我所做的应用程序我从未使用过onStart 我在
  • Grade Plugin 3-alpha1 输出文件导致错误

    我正在尝试将项目更新到 Android Studio 3 build gradle 文件中不再接受以下代码片段 applicationVariants all variant gt variant outputs each out gt d
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • Lucene/Hibernate 搜索锁定异常

    我使用 Hibernate Search 在 Web 应用程序上索引和全文搜索项目 没有问题 来自我的 pom xml
  • JavaScript 点击事件在 Android 4.0.4 默认浏览器上的 Samsung Galaxy SIII 上不起作用

    我在 Android 4 0 4 上使用 Samsung Galaxy SIII 的默认浏览器时遇到了最奇怪的问题 对于以下页面 单击链接将不会触发 JavaScript 处理程序 从其中一个 div 的内容中删除单个 a 字母使它们再次工
  • 在没有EOF的情况下停止读取java中的输入

    In 问题 如何停止读取输入 我的程序继续运行 要求更多输入 public static void main String args throws Exception BufferedReader br new BufferedReader
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 有没有办法暂停所有 Threading.Timer 计时器?

    我是 C 新手 正在开发一个需要多个计时器的程序 我想知道当程序运行 CPU 密集型代码时是否有办法同时暂停该程序中的所有计时器 目前 当前启用的计时器尝试赶上密集操作期间引发的所有计时器事件 我认为您可以创建这些计时器的列表 当您激活它们
  • 在 Java 中运行 CUDA 代码的最简单方法是什么?

    我有一些用 C 语言编写的 CUDA 代码 它似乎工作正常 它是普通的旧 C 而不是 C 我正在运行一个 Hadoop 集群 并且想要整合我的代码 因此理想情况下我希望在 Java 中运行它 长话短说 系统太复杂 目前 C 程序解析日志文件
  • 在android中以不同模式打开手电筒

    下面的代码可以在不支持手电筒的 Android 设备 例如摩托罗拉剃须刀 上运行吗 请哪位好心人测试一下是否有这样的手机并请告诉我 提前致谢 if isFlashOn if camera null params null return Li
  • ClientRect 神秘地比 WindowRect 小?

    我在 Visual Studio 中启动了一个新的 Windows 桌面 C 项目 窗口创建如下所示 HWND hWnd CreateWindowW szWindowClass szTitle WS OVERLAPPEDWINDOW CW
  • 如何将图表嵌入到幻灯片或苹果的主题演讲中?

    我正在学习如何用plotly 生成图表 我是生物化学研究生 我想将这些图表用于演示文稿 例如幻灯片 主题演讲 我想知道是否有人可以给我一个总体策略或教程链接 谢谢你 Plotly 有一个 MS Office 应用程序 允许嵌入 Window
  • Java中重新定义静态方法意味着什么?

    我一直在阅读 SCJP 学习指南中有关静力学的部分 其中提到了以下内容 静态方法不能被重写 但它们可以被重新定义 重新定义到底意味着什么 是否存在父级和子级中都存在具有相同签名的静态方法的情况 但它们是通过类名单独引用的 例如 class
  • 如何在 mongodb 的正则表达式 $match 中使用聚合中的字段?

    我的用例的一个非常简化的版本是查找以作者姓名开头的所有帖子 如下所示 gt db users find id ObjectId 5c4185be19da7e815cb18f59 name User1 id ObjectId 5c4185be
  • Javascript防止可拖动div位于父div之外

    我有可拖动的div 我希望使用 javascript 将这个可拖动的 div 限制在父级中 我知道如何使用 jquery UI 可拖动插件来防止可拖动 div 但我不确定如何使用本机 javascript 限制可拖动 请在下面找到我的代码
  • 在批处理文件中使用方框图 Unicode 字符

    我正在制作一个使用这些字符的批处理文件 它不起作用 它只是自行终止 我见过人们使用这样的字符 它不是字符 但它变成了字符 有人可以给我这些字符的列表 显示上面字母的类型以及它变成什么 如果要编写使用这些字符的控制台批处理文件 则需要一个编辑
  • 按名称而不是在 cx_Oracle 中的位置获取列值

    Using cx Oracle 我正在从 Oracle 数据库中选择数据 curs cxn cursor result curs execute SELECT FirstName LastName FROM Person 有没有办法只返回名
  • Joda-Time,没有日期的时间

    我想要一个只存储时间而不存储日期或日期的类 Joda Time 有这方面的课程吗 或者我是否必须使用日期时间并仅将时间部分转换为字符串 然后使用该部分 有的是LocalTime http joda time sourceforge net
  • 根据选择下拉列表 javascript 中的 ID 显示隐藏元素

    我知道这可能是最常被问到的问题 但我已经搜索了网络并尝试了几个例子 但没有一个起作用 这是我的问题 首先我无法控制TR TD结构 无法使用DIV 我需要能够根据选择的下拉菜单值显示某些 TD 我有 4 个不同的 id 我使用 to to f
  • 如何从两端迭代序列?

    我想 从两端 到 该部分的 中间 此处 迭代Python序列 的一部分 在 C C Java 中 我可能会尝试 int start 2 beyond 7 for int forward start back beyond forward l
  • 如果应用程序关闭则推送通知(React-Native)

    我正在开发 React native 应用程序 iOS 和 Android 服务器通过网络套接字连接 服务器发送有关某些特定事件的通知 应用程序应该通知用户 使用警报 如果我需要通知用户 即使应用程序正在后台运行或关闭 我该怎么做 推送通知
  • 如何去掉http://和www。使用 c# 从输入的域名

    在我正在开发的应用程序中 我们允许用户输入域名列表 我们希望用户以以下任何格式输入域名 stackoverflow com http www stackoverflow com www stackoverflow com http www
  • 如何将自定义 URL 协议与 ClickOnce 应用程序关联?

    我想关联一个自定义URL http en wikipedia org wiki Uniform Resource Locator协议 例如 myprotocol SomeFolder SomePage 与一个单击一次 http en wik
  • Laravel Eloquent 比较列值

    雄辩的where 比较两列值时似乎不起作用 如何修复它 示例代码 gt where table 1 name table 2 name 但适用于 gt where table 1 name john 在这种情况下不需要转义 您可以使用whe
  • Terraform API 网关未显示为 Lambda 的触发器

    我按照说明进行操作here https learn hashicorp com tutorials terraform lambda api gateway用于设置网关和 lambda 但它不起作用 症状似乎与描述的相同here https
  • 为什么在打印语句之前调用函数?

    include
  • Android 混合语言文本 - 带 RTL 和 LTR 文本的字符串上的 BidiFormatter

    我有一个ListView与定制View我在哪里有一个TextView