禁止輸入Emoji的EditText

Emoji是什么

Emoji是一組Unicode編碼與一組表情描述之間一一對應(yīng),而圖片的實現(xiàn)是由各個系統(tǒng)或者軟件針對同一的表情描述來各自實現(xiàn)的。

Emoji在Android中的使用

Emoji是通過Unicode統(tǒng)一編碼實現(xiàn)的,那么我們就可以使用Character.toChars()方法將Unicode編碼轉(zhuǎn)換為一個char數(shù)組,再將這個char數(shù)組轉(zhuǎn)換為字符串就可以直接操作了,操作系統(tǒng)會自行將其解析為表情圖片的,然后顯示在文本組件中。

private void setEmojiToTextView(){
    int unicodeJoy = 0x1F602;
    String emojiString = getEmojiStringByUnicode(unicodeJoy);
    myTextView.setText(emojiString);
}

private String getEmojiStringByUnicode(int unicode){
    return new String(Character.toChars(unicode));
}

當(dāng)然,這只是其中的一種方法,我們還可以通過Emoji字體庫來實現(xiàn)效果,將制作好Emoji字體庫拷貝到android工程的assets/fonts目錄,然后代碼中進(jìn)行處理:

try {
    Typeface typeFace = Typeface.createFromAsset(getResources().getAssets(),"fonts/AndroidEmoji.ttf");
        title.setTypeface(typeFace);
} catch (Exception e) {
        Logger.e(e);
}

之后,當(dāng)我們在該title控件上輸入Emoji表情的Unicode后會自動轉(zhuǎn)換為表情圖片。

禁止輸入Emoji的EditText

public class ForbidEmojiEditText extends EditText {

    private Context mContext;
    // 是否重置了EditText的內(nèi)容
    private boolean resetText;
    //光標(biāo)位置
    private int cursorPosition;
    //輸入emoji之前文本內(nèi)容
    private String inputAfterText;

    public ForbidEmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, null);
    }

    public ForbidEmojiEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initEditText();
    }

    public ForbidEmojiEditText(Context context) {
        super(context);
        initEditText();
    }

    private void initEditText() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if (!resetText) {
                    cursorPosition = getSelectionEnd();
                    //這里用s.toString而不直接用s
                    //是因為String是引用數(shù)據(jù)類型,如果直接用s的話,指向的地址是同一個
                    // 當(dāng)s改變了inputAfterText也改變,那么表情過濾失敗
                    inputAfterText = s.toString();
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!resetText){
                    //表情符號長度至少為2
                    if (count >= 2){
                        CharSequence input = s.toString().subSequence(cursorPosition,cursorPosition+count);
                        if (isContainsEmoji(input.toString())){
                            resetText = true;
                            Toast.makeText(getContext(), "不支持輸入表情符號", Toast.LENGTH_SHORT).show();
                            setText(inputAfterText);
                            CharSequence text = getText();
                            if (null != text){
                                Selection.setSelection((Spannable) text,text.length());
                            }
                        }
                    }
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    /**
     * 檢查是否包含Emoji
     *
     * @return
     */
    private static boolean isContainsEmoji(String source) {

        for (int i = 0;i<source.length();i++){
            char c = source.charAt(i);
            if (isEmojiCharacter(c)){// 如果不能匹配,則該字符是Emoji表情
                return true;
            }
        }
        return  false;
    }


    /**
     * 判斷單個字符是否為emoji字符
     * @return
     */
    private 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));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容