禁止输入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));
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容