前段时间项目中有一个EditText规定是禁止输入输入法表情的,很快就写好了,一直到现在才被测出问题来,中间都上了好几个版本了,测试都换了几批了,可见公司的QA是怎么个情况,唉,也就在这里说说,反正他们看不到,,看到了也不知道谁说的。好了言归正传,先看一下错误的代码,大家可以研究一下,现在已经改好了,翻翻git历史把错误代码copy下来... ...

 mAppraiseEdit.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {cursorPos = mAppraiseEdit.getSelectionEnd();inputAfterText = s.toString();}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (!resetText) {if (count >= 2) {CharSequence input = s.subSequence(cursorPos, cursorPos + count);if (TextUtil.containsEmoji(input.toString())) {resetText = true;UIUtils.showShortCustomToast(AppraiseActivity.this, "当前不支持输入表情符号");mAppraiseEdit.setText(inputAfterText);CharSequence text = mAppraiseEdit.getText();if (text instanceof Spannable) {Spannable spanText = (Spannable) text;Selection.setSelection(spanText, text.length());}return;}}} else {resetText = false;}}@Overridepublic void afterTextChanged(Editable s) {}});

就是在这种情况下这个bug藏了一个版本有一个版本,干倒了一个又一个QA,感兴趣的可以先试一下,找一下会有什么问题存在,后续我再说明一下在什么情况下会出问题,哦,对了,出现的是IndexOutOfBoundsException问题。

最后我是在afterTextChanged(Editable s)方法中解决的,我想检测到有表情符号后就直接在现有的字符串上截去1个字符就好了,最后发现每次截取后,edittext中都会多一个“�”,有点不知所错。我打印了Editable 在不同情况下混合输入英文、汉字、符号及表情他的s.length与s内容的关系,每次输入表情s的内容都是“��”,他们的关系是:首先输入表情时,s="��",s.length=2;输入一个英文字母在输入表情时,s="e��",s.length=3;输入一个汉字在输入表情时,s="我��",s.length=3;看来一个表情,android是让两个“��”代替的,我尝试用s.equals("��")去判断,结果发现根本不行,弄了有一个来小时下班了,正好明天是周末,休息了两天,周一上班的时候,打开电脑看这个bug恍然大悟,既然每个表情都会占两个length的长度,那么只要我检测出输入框中包含表情了以后,直接在当前String删除掉尾部length 2的长度就好(因为当你输入表情时执行afterTextChange()时,String已经加上了表情的“��”),然后根据自己的想法很快就实现了想要的结果。现在回想上周五,可能自己当时已经钻的太深了,从思想上没有走出来,傻了已经,自己直接把自己鄙视了:擦,咋回事,当时脑子进水了,还是让驴踢了,这不是很简单吗,咋就折腾了一小时,行,折腾就折腾呗,还他妈没整出来! 好了,调侃一下,下边直接上代码:

edittext.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {int index = mAppraiseEdit.getSelectionStart() - 1;if (index > 0) {if (TextUtil.isEmojiCharacter(s.charAt(index))) {Editable edit = mAppraiseEdit.getText();edit.delete(s.length() - 2, s.length());UIUtils.showShortCustomToast(AppraiseActivity.this, "不支持输入表情符号");}}}});

唉,就是这么简单,对了说一下上边的那种写法的bug,跟一些三方输入法有关系,有些输入法当你输入中文的时候字母会提前显示到edittext中。比如:我想输入“新闻”这个词语,有些输入法当你输入“xw”的时候,在edittext里边是空的,只是在输入法的中文部分出现“新闻”、“学着”、“现在”等等,在edittext中仍然是空的,而有一些输入法就会在edttext中先出现“xw”下边会有一道线,当你选择“新闻”的时候“xw”就会被“新闻”替换掉。现在这个bug就出现在后边这种情况就会在CharSequence input = ssubSequence.(cursorPos,cursorPos+ count);这行代码上报一个IndexOutOfBoundsException的bug。感兴趣的可以去解决一下,今天的blogs就先到这,篇幅较小,只为自己吐槽一下,顺便记录一下。

检测是否存在表情代码如下:

public static boolean isEmojiCharacter(char codePoint) {return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));}

Android之Edittext禁止输入表情符号(雷惊风)相关推荐

  1. Android签名机制及PMS中校验流程(雷惊风)

    @Android签名机制及PMS中校验流程(雷惊风) 网上看到一篇比较好的关于Android签名的文章,但是文章链接不安全,不知道哪天会不会找不到了,而且需要关注才能查看完整版,所以在这里记录一下,原 ...

  2. Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法

    Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 参考文章: (1)Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 (2)https: ...

  3. Android深入源代码分析理解Aidl总体调用流程(雷惊风)

    2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...

  4. EditText禁止输入表情符号

    因项目需求,需要禁止用户输入表情符号,个人认为方式有俩种. 第一种键盘弹出不显示表情选项(失败,因为每个手机的Rom烧制都是固定的,很难去操作,主要是水平有限): 第二种,显示表情选项,但是输入之后E ...

  5. android 不能输表情,Android中EditText禁止输入表情

    最近在做的项目中用户编辑资料的时候不希望用户输入表情,如果用户输入表情的话上传给后台要报错,所以需要我们前端做一个判断.下面就来说一下怎么在EditText中屏蔽表情吧. 网上有很多这样的列子但是一不 ...

  6. android edittext 输入法表情,Android开发中EditText禁止输入Emoji表情符

    在开发中可能多处会用到过滤Emoji表情符,一般情况下,我们会通过EditText的addTextChangedListener()监听来过滤Emoji表情,但在实际开发中会遇到多个EditText, ...

  7. android中禁止输入表情符号,Android EdText编辑框禁止输入表情符号(使用正则表达式)...

    使用正则表达式 p s f s not_emoji = "[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u ...

  8. android edittext过滤表情,EditText过滤表情符号

    项目中我们通常可以通过第三方输入法项Android文本框中输入表情符号,但是后台解析时可能会报错,所以通常我们都会屏蔽掉EditText的表情符号输入.下面介绍一下自己为了解决这个问题爬过的坑. 第一 ...

  9. android edittext输入邮箱,[Android教程]EditText怎样限制用户的输入?数字/字母/邮箱

    有输入必有验证.为了防止用户随便输入确保提交数据的合法性,程序不得不在文本输入框(EditText)中增加限制或验证. 关于输入类型有数字.字母.邮箱.电话等形式,这些具体得根据业务来.那么Andro ...

  10. android edittext光标太大,Android中EditText样式修改 聚焦光标、背景

    在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...

最新文章

  1. 使用Python的库qrcode生成二维码
  2. wireshark抓取https并解密方法一
  3. Hystrix熔断器功能测试示例数据
  4. 【RK3399Pro学习笔记】五、ROS与USB摄像头
  5. Linux虚拟化:Virtio: 一个 I/O 虚拟化框架
  6. link标签中的integrity和crossorigin字段---web前端工作笔记015
  7. iOS 动画(三)CABasicAnimation animationWithKeyPath 一些规定的值
  8. 基于阿里云上实现全站https
  9. 第 14 章 结构和其他数据形式(names)
  10. pivot 与 unpivot函数
  11. java人事考勤打卡小程序源码
  12. 图表背后的秘密 | 技术指标讲解:布林带指标
  13. 常用的图像标注工具汇总
  14. alt复制选区就会卡 ps_ps怎么把选区复制出来
  15. “3D游戏之父”手游考古,网友:求支持智能手机!
  16. Git与bitbucket简单使用
  17. 电商网站适合用什么服务器?
  18. html 做笔记,HTML笔记(一)
  19. pythonscrapy爬虫 崔庆才_Scrapy爬虫(一):专题概要
  20. 2020最流行的React组件库推荐

热门文章

  1. InstallShield可靠的 Windows 安装程序
  2. “第三届金融CIO班”开学典礼成功举行
  3. 机器学习中的概率分布
  4. 记YY的一次面试经历
  5. Hadoop安装snappy(编译源码)
  6. dna数据u盘_DNA数据库黑客时代来临
  7. AI编辑文字时会出现“滚滚长江东逝水”解决方法
  8. 2021-04-13
  9. 编程术语晦涩_晦涩的编程语言的乐趣
  10. 微信发红包测试用例设计