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));
    }







發佈了29 篇原創文章 · 獲贊 29 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章