文章目录

  • 1.Android阿拉伯语混排显示关键类 BidiFormatter
    • 1.示例一
      • 测试一
      • 测试二
      • 测试三
      • 测试三
      • 测试四
      • 测试五
    • 2. 示例二
    • 3. 示例三
    • 4. 示例四
  • 2.关于实现上面功能中途碰到另外两个小问题
  • 好了,全文结束,如有问题,欢迎大家指正交流~

1.Android阿拉伯语混排显示关键类 BidiFormatter

关于这个类的具体使用大家可以阅读一下官方文档
BidiFormatter

阿拉伯语的显示阅读方式都是自右向左的,与我们熟悉的自左向右刚好相反。

为了便于讲解,我这里把代码和显示效果一起结合说明。

下面要用到的方法
import androidx.core.text.BidiFormatter

fun String.biDiFormat(): String {return BidiFormatter.getInstance(Locale.getDefault()).unicodeWrap(this, TextDirectionHeuristicsCompat.LOCALE)}

这里注意用到androidx.core.text
还有一个相同类是在android.text包下的,但是它的unicodeWrap方法只能在android8.0以上才可以使用。

1.示例一
测试一
  val content = "我是中国人"binding.tv.text = content

在系统语言是自左向右环境下显示如下

在系统语言是自右向左下显示如下

第一张图是自左向右环境下显示是没有问题的
第二张图你是不是觉得也没什么问题呢?
光从文字上看确实是没什么问题,但是我们在系统语言是自右向左的阅读方式下显示时,
那这就是问题了,正常显示的话文本应该是位于屏幕右侧,那怎么实现这个效果呢。如下:

  val content = "我是中国人"binding.tv.text = content.biDiFormat()

在系统语言是自右向左下显示如下

此时的显示才是正确的效果。

测试二
val stringBuffer = StringBuffer()
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString()

在系统语言是自右向左下显示如下

在系统语言是自左向右环境下显示如下

此时的第二张图显示效果是没有问题的,因为系统语言是自右向左下,文本显示也是位于屏幕右侧,阅读方式也是从右往左。我们在看第一张图,文本在系统语言是自左向右环境下位于屏幕右侧,读取方式也是从右往左,正常情况下文本显示是在屏幕左侧,阅读方式也是从左往右。为了修改这个问题使用修改方法同上:

val stringBuffer = StringBuffer()
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString().biDiFormat()

在系统语言是自左向右环境下显示如下

此时的显示才是正确的效果。

测试三
val stringBuffer = StringBuffer()
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString()

在系统语言是自左向右环境下显示如下

在系统语言是自右向左下显示如下

分析同测试一和测试二,图一显示没有问题,
图二显示文本应该是靠右边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上

测试三
val stringBuffer = StringBuffer()
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString().biDiFormat()

在系统语言是自右向左下显示如下

此时的显示才是正确的效果。

测试四
val stringBuffer = StringBuffer()
stringBuffer.append("我是")
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString()

在系统语言是自左向右环境下显示如下

在系统语言是自右向左下显示如下

分析同上,图一显示没有问题;
图二显示文本应该是靠右边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上:

val stringBuffer = StringBuffer()
stringBuffer.append("我是")
stringBuffer.append("يبيب")
stringBuffer.append("中国人")
binding.tv.text = stringBuffer.toString().biDiFormat()

在系统语言是自右向左下显示如下

此时的显示才是正确的效果。

测试五
val stringBuffer = StringBuffer()
stringBuffer.append("يسيي")
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString()

在系统语言是自左向右环境下显示如下

在系统语言是自右向左下显示如下

分析同上,图二显示没有问题;
图一显示文本应该是靠左边,而且两个文本的位置也是相反了。
那么要修改这个问题方式同上:

val stringBuffer = StringBuffer()
stringBuffer.append("يسيي")
stringBuffer.append("中国人")
stringBuffer.append("يبيب")
binding.tv.text = stringBuffer.toString().biDiFormat()

在系统语言是自左向右环境下显示如下

2. 示例二
var  msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"

假设上述文本要在系统语言是自右向左下正确显示,那么它显示的结果应该是下面这样

var  msg = "<count> <giftIcon> <receiverNames> أرسل إلى <nickName>"

那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat

 var  msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()

此时在自右向左下显示的结果如下:

通过上图发现,上述文本拆分成
<nickName>、<receiverNames> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName>和<receiverNames> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。

下面我们把 <giftIcon> 这个做了一个biDiFormat

 var  msg = "<nickName> أرسل إلى <receiverNames> <giftIcon> <count>"msg = msg.replace("<giftIcon>","<giftIcon>".biDiFormat())binding.tv.text = msg.biDiFormat()

此时显示的结果就符合我们的预期了。
给<giftIcon>加上biDiFormat之后,
相当于给<giftIcon>整体包裹起来,然后它的顺序就变成是自右向左的模式,
所以它会把两端的文本格式是自左向右的进行互换位置。

3. 示例三
var  msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"

假设上述文本要在系统语言是自右向左下正确显示,那么它显示的结果应该是下面这样

var  msg = "<count> <giftIcon> <giftName> <receiverNames> أرسل إلى <nickName>"

那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat

 var  msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()

此时在自右向左下显示的结果如下:

通过上图发现,上述文本拆分成
<nickName>、<receiverNames> <giftName> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName>和<receiverNames> <giftName> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。

下面我们把 <giftName> 这个做了一个biDiFormat

         var  msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())binding.tv.text = msg.biDiFormat()

位置互换的逻辑跟示例二一致,以<giftName>为中心,<receiverNames>、<giftIcon> <count> 进行位置互换。
此时还未符合我们的预期,<giftIcon> <count> 位置还需要进行调换,

下面我们把 <count> 这个做了一个biDiFormat

         var  msg = "<nickName> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())msg = msg.replace("<count>","<count>".biDiFormat())binding.tv.text = msg.biDiFormat()

因为<giftName>已经做过一次biDiFormat(),它就是自右向左所以它的位置不会变更。
那么最后<giftIcon>和<count>进行位置互换,此时显示的结果就符合我们的预期了。

4. 示例四
var  msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"

假设上述文本要在系统语言是自右向左下正确显示,那么它显示的结果应该是下面这样

var  msg = "<count> <giftIcon> <giftName> <receiverNames> أرسل إلى <address> <nickName>"

那要怎么样才能达到这个效果呢
首先我将msg整体进行一次bidiFormat

 var  msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"binding.tv.text = msg.biDiFormat()

此时在自右向左下显示的结果如下:

通过上图发现,上述文本拆分成
<nickName> <address>、<receiverNames> <giftName> <giftIcon> <count>、أرسل إلى
三个部分,然后<nickName> <address>和<receiverNames> <giftName> <giftIcon> <count>做了一个整体的镜像,但是这并没有达到我们的效果。

下面我们把 <giftIcon> 这个做了一个biDiFormat

         var  msg = "<nickName> <address> أرسل إلى <receiverNames> <giftName> <giftIcon> <count>"msg = msg.replace("<giftName>","<giftName>".biDiFormat())msg = msg.replace("<count>","<count>".biDiFormat())msg = msg.replace("<address>","<address>".biDiFormat())binding.tv.text = msg.biDiFormat()

此时显示的结果就符合我们的预期了。

上述如有理解不对的地方,欢迎大家一起探讨。

2.关于实现上面功能中途碰到另外两个小问题

  • 1.当文本中存在两个连续空格的情况下,经过Html.fromHtml后空格只显示一个,
    所以我们需要通过replace(" ", "\u00A0")进行替换。

  • 2.关于Spanned当中几个标志位
    SPAN_EXCLUSIVE_EXCLUSIVE 不包含两端
    SPAN_INCLUSIVE_INCLUSIVE 包含两端
    SPAN_EXCLUSIVE_INCLUSIVE 不包含开始 包含结尾
    SPAN_INCLUSIVE_EXCLUSIVE 包含开始 不包含结尾

具体的理解以及示例大家可以去这里看

好了,全文结束,如有问题,欢迎大家指正交流~

Android阿拉伯语混排相关推荐

  1. Android 系统(226)---Android 阿拉伯语适配

    Android 阿拉伯语适配 RTL 语言由来 RTL 是 Right-to-left(从右向左) 的缩写.其意为人们书写阅读习惯是从右向左,朝左继续的,常见的 RTL 语言有阿拉伯语,希伯来语等. ...

  2. Android阿拉伯语UI适配问题汇总

    Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...

  3. android多媒体图文混排,干货!!!Android富文本实现图文混排

    效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...

  4. Android中文图混排时文图的居中对齐 FontMetrics以及自定义ImageSpan实现

    文章转自:http://www.sohu.com/a/150059234_611601 本文作者CnPeng的博客地址: http://www.jianshu.com/p/2650357f7547 这 ...

  5. android多媒体图文混排,android图文混排

    背景 最近我们的产品来了个新的模块,给学生做题提高成绩的.需求如下: 支持单选.多选.填空题 支持图片文字混排 输入框有交互,排版精致美观 为了体验优化,不能使用网页实现效果 思路分析 我们的图文混排 ...

  6. Android 动态图文混排的常用方法

    2019独角兽企业重金招聘Python工程师标准>>> DrawableIcon的设置 对于TextView或者EditText动态设置drawableLeft,drawableRi ...

  7. Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排

    最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本T ...

  8. android 阿拉伯语下的光标,android – 在EditText中的游标提示不是从右边开始的阿拉伯语...

    我正在尝试使用提示文本制作EditText: 用英文"password"..光标正确设置在左侧. 但对于提示为"كلمهالمرور"的阿拉伯语,光标始终设置为 ...

  9. android 阿拉伯语下的光标,android – EditText中的双光标,用于输入类型编号/电话(RTL阿拉伯语)...

    我有一个EditText设置为重力右,所以如果语言是阿拉伯语,文本从右边开始. 注意:我的应用程序支持RTL,我没有为EditText设置TextDirection,因为它会遇到同样的问题.设置为Ri ...

最新文章

  1. php计算有多少页,PHP 计算页面执行时间
  2. 为什么“不懂数据结构与算法”的程序员一定走不远?
  3. 《STL源码剖析》学习--6章--_rotate算法分析
  4. 1.编写程序,打印基本ASCII码表(可印刷32到126)。
  5. SQL2005实现全文检索的步骤 停止数据库的用户连接
  6. Xcode 静态库调试策略
  7. Java判断字符串是否是数值
  8. mysql统计信息表行数不准确_mysql SQL调优-统计信息不准的原因
  9. 2013.8.4thinkPHp学习
  10. IT公司组织机构和职位、职位职责
  11. Oracle 逗号分割的字符串转换为可放入in的语句
  12. 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
  13. 2018年计算机网络考研真题
  14. matlab继续截止频率,关于-3db截止频率
  15. 字谜游戏(b)C语言
  16. 试验设计方法与Design-Expert软件应用目录
  17. 穿山甲android对接错误码40029,空Android项目集成Cocos、穿山甲。Lua调用网络接口。...
  18. RPG Maker MV 打包安卓和修改分辨率的方法
  19. 测试3d游戏pfs的软件,Beepa Fraps(3D游戏测帧录制软件)
  20. 基于ssm框架的同城物流配送网站系统

热门文章

  1. vue购物车案例(源码)
  2. 跨域 -- cors
  3. mysql blob图片类型存储bug解决:索引超出了数组界限错误,MySqlBlob图片类型存储Bug解决:索引超出了数组界限错误_MySQL...
  4. ArcGIS不同图层的线要素合并
  5. VC界面编程skill tips-CListCtrl
  6. 《合约星期五》OKEx季度0906期合约周报:多军空军大单换手吸筹三日迅速拉升突破10000美金大关
  7. wordpress 如何安装流体播放器插件(fluid player)
  8. 【C++笔试强训】第三十二天
  9. ElasticJob分布式定时任务调度框架以及生产遇到的问题
  10. vue 使用 iconfont-阿里巴巴矢量图标库