今天处理项目上的一个诡异BUG,贴吧Android客户端发贴框是支持表情文字混排的,但是当发贴框的行内容末尾为表情时,尝试在表情后插入文字,就悲剧了:文字其实写进去了,但是不会显示出来。研究了一下,发现是Android原生EditText控件的一个bug。
下面是拿腾讯的微信做个测试,分析一下这个bug的产生现象和原因。注:微信的回复框也是EditText控件来做的,同样支持表情文字混排。
首先在输入框中输入两行内容,然后尝试将光标拖动到第一行的最末尾字符处:你会发现,你办不到!
光标一定是停留在改行文字的最后一个字符之前!这个结论很重要!
接下来我们将整行内容都换成表情,做同样的一个测试:
这个时候会惊奇的发现,光标可以移动到行尾!!!但是,我要说的是:这是一个假象,因为显示到EditText中的表情,是通过SpannableString来实现的,真正的内容依然是字符串,表情是一个ImageSpan,所以,这个时候EditText的内容其实还是一堆字符串,光标其实还是和第一种情况一样,也处于最后一个字符之前!
这个时候我们向光标处输入“大家好”三个文字,你又会惊奇的发现,文字没有显示出来,就跟没输入成功一样!接下来点击“发送”将EditText控件中的内容发送出去,经过一系列的网络请求,再回显到聊天面板中,你再会惊奇的看到:
是的,原本第一行的内容是这个样子的:“/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:<”,然而光标是在最后一个字符“<”之前的,“大家好”这几个文字被插入到了“/:<”这个表情符号之间,所以,也就破坏掉了这个表情的解析。当然,类似的情况,在贴吧的发贴框是存在的。
这个问题没有什么好的办法解决,不过如果产品觉得OK的话,研发可以在插入的每个表情后面强制跟上一个半角空格,用于站位,这样,光标就可以正确的落到表情符号的末尾。但是,强制修改了用户的输入内容,始终是对用户的不尊重;不过BUG还是得想办法解决的,有些纠结是吧?