美文网首页
禁止输入Emoji的EditText

禁止输入Emoji的EditText

作者: ShereenAo | 来源:发表于2017-06-27 15:38 被阅读0次

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

    相关文章

      网友评论

          本文标题:禁止输入Emoji的EditText

          本文链接:https://www.haomeiwen.com/subject/gesecxtx.html