禁止輸入Emoji的EditText

Emoji是什么

Emoji是一組Unicode編碼與一組表情描述之間一一對應,而圖片的實現是由各個系統或者軟件針對同一的表情描述來各自實現的。

Emoji在Android中的使用

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

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

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

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

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

之后,當我們在該title控件上輸入Emoji表情的Unicode后會自動轉換為表情圖片。

禁止輸入Emoji的EditText

public class ForbidEmojiEditText extends EditText {

    private Context mContext;
    // 是否重置了EditText的內容
    private boolean resetText;
    //光標位置
    private int cursorPosition;
    //輸入emoji之前文本內容
    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是引用數據類型,如果直接用s的話,指向的地址是同一個
                    // 當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));
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容