Android EditText控件行尾为表情时的BUG
今天处理项目上的一个诡异BUG,贴吧Android客户端发贴框是支持表情文字混排的,但是当发贴框的行内容末尾为表情时,尝试在表情后插入文字,就悲剧了:文字其实写进去了,但是不会显示出来。研究了一下,发现是Android原生EditText控件的一个bug。
下面是拿腾讯的微信做个测试,分析一下这个bug的产生现象和原因。注:微信的回复框也是EditText控件来做的,同样支持表情文字混排。
首先在输入框中输入两行内容,然后尝试将光标拖动到第一行的最末尾字符处:你会发现,你办不到!

光标一定是停留在改行文字的最后一个字符之前!这个结论很重要!
接下来我们将整行内容都换成表情,做同样的一个测试:

这个时候会惊奇的发现,光标可以移动到行尾!!!但 是,我要说的是:这是一个假象,因为显示到EditText中的表情,是通过SpannableString来实现的,真正的内容依然是字符串,表情是一 个ImageSpan,所以,这个时候EditText的内容其实还是一堆字符串,光标其实还是和第一种情况一样,也处于最后一个字符之前!
这个时候我们向光标处输入“大家好”三个文字,你又会惊奇的发现,文字没有显示出来,就跟没输入成功一样!接下来点击“发送”将EditText控件中的内容发送出去,经过一系列的网络请求,再回显到聊天面板中,你再会惊奇的看到:

是的,原本第一行的内容是这个样子的:“/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:8-)/:<”,然而光标是在最后一个字符“<”之前的,“大家好”这几个文字被插入到了“/:<”这个表情符号之间,所以,也就破坏掉了这个表情的解析。当然,类似的情况,在贴吧的发贴框是存在的。
这个问题没有什么好的办法解决,不过如果产品觉得OK的话,研发可以在插入的每个表情后面强制跟上一个半角空格,用于站位,这样,光标就可以正确的落到表情符号的末尾。但是,强制修改了用户的输入内容,始终是对用户的不尊重;不过BUG还是得想办法解决的,有些纠结是吧?
Android EditText控件行尾为表情时的BUG的更多相关文章
- android:EditText控件
EditText 是程序用于和用户进行交互的另一个重要控件,它允许用户在控件里输入和编 辑内容,并可以在程序中对这些内容进行处理.EditText 的应用场景应该算是非常普遍了, 发短信.发微博.聊 ...
- Android EditText控件即设置最小高度又运行高度随内容增加而变化
(转)http://www.aichengxu.com/view/1405748 记录学习用 如题,有时候EditText需要一个最小的高度,但是在输入更多内容时,要随着内容的增加而变化高度,一般 ...
- android EditText控件可输入正负数及小数位
设置android:inputType="numberSigned|numberDecimal" <EditText android:id="@+id/editTe ...
- 【我的Android进阶之旅】如何隐藏Android中EditText控件的默认下划线
Android EditText控件是经常使用的控件,但是有时候我们并不需要它的一些默认的属性,比如说下划线,因为有时候这样的默认下划线看起来特别怪异,和其他控件在一起搭配的时候不协调,因此有时候就需 ...
- android 基础控件 EditText
EditText 简介: EditText 控件继承 TextView ,它有TextView的所有属性和方法,并且自身是可编辑的: extends TextView java.lang.Object ...
- Android 动态背景的实现以及SurfaceView中添加EditText控件
首先还是一贯作风,我们先看案例: \ 静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并不复杂,这个如果让做 ...
- MaterialEditText——Android Material Design EditText控件
MaterialEditText是Android Material Design EditText控件.可以定制浮动标签.主要颜色.默认的错误颜色等. 随着 Material Design 的到来, ...
- android开发 软键盘出现后 防止EditText控件遮挡 总体平移UI
在EditText控件接近底部的情况下 软键盘弹出后会把获得焦点的EditText控件遮挡 无法看到输入信息 防止这种情况发生 就须要设置AndroidManifest.xml的属性 前面的xml信 ...
- Android 开源控件与常用开发框架开发工具类
Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...
随机推荐
- C# 在运行时动态创建类型
C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译 ...
- javaScript创建无边框iframe兼容ie
<script>var m_iframe=document.createElement("iframe");m_iframe.scrolling="no&qu ...
- MongoDB的安全性
上篇文章介绍Mongo启动了,一般数据库启动,下面的操作就是登录数据库了,之前测试数据库是否正常安装的时候也登录过数据库,现在回想一下,好像连用户名和密码都没有输入,找几篇帖子来探究下Mongodb的 ...
- QQ空间g_tk加密算法PHP版
QQ空间g_tk加密算法PHP版 //G_tk计算 function getGTK($skey){ $hash = 5381; for($i=0;$i<strlen($skey);++$i){ ...
- php substr,iconv_substr,mb_substr
php进行中文字符串的截取时,会经常用到二个函数iconv_substr和mb_substr,对这二个函数应该如何选择呢?参考下本文介绍的例子就明白了. 示例代码,用到了函数substr与iconv_ ...
- xml学习总结(一)
xml DTD 定义元素<!ELEMENT 元素名 元素类型描述 > (1)元素类型描述:任意类型,字符串型,空元素,包含子元素,混合类型 任意类型: <?xml version=& ...
- python del函数
del用于list列表及字典操作,删除一个或者连续几个元素也可以删除字典指定的key 示例程序如下: >>> a = [-1, 3, 'aa', 85] # 定义一个list&g ...
- 从浏览器启动应用程序 - Application URL
关键字:Browser,Application,URL Protocol,Windows,Mac,IE,Chrome,Safari. OS: Windows 7, OS X Yosemite. Win ...
- install window7
install window7 http://www.zhujixc.com/win7home/http://jingyan.baidu.com/album/5bbb5a1b3e301713eba17 ...
- js中arguments的作用
在javascript函数体内,标识符arguments具有特殊含义.它是调用对象的一个特殊属性,用来引用Arguments对象. Arugments对象就像数组,注意这里只是像并不是哈. javas ...