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

        前段时间项目中有一个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));
    }







你可能感兴趣的:(控件处理)