您的位置:首页 > 移动开发 > Android开发

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

2016-08-01 15:28 363 查看
        前段时间项目中有一个EditText规定是禁止输入输入法表情的,很快就写好了,一直到现在才被测出问题来,中间都上了好几个版本了,测试都换了几批了,可见公司的QA是怎么个情况,唉,也就在这里说说,反正他们看不到,

,看到了也不知道谁说的。好了言归正传,先看一下错误的代码,大家可以研究一下,现在已经改好了,翻翻git历史把错误代码copy下来...
...

mAppraiseEdit.addTextChangedListener(new TextWatcher() {

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
cursorPos = mAppraiseEdit.getSelectionEnd();
inputAfterText = s.toString();
}

@Override
public 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;
}

}

@Override
public 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() {

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public 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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: