android 输入框EditText禁止输入Emoji表情符

转载请注明出处:http://blog.csdn.net/elsdnwn/article/details/45390771

通过添加EditText的addTextChangedListener()监听来过滤Emoji表情:

  • onTextChanged()
  • beforeTextChanged()
  • 使用方法
  • 在开发中可能多处会用到过滤Emoji表情符,为了方便使用自定义EditText来实现:

package com.liujy.ui.wiget;import android.content.Context;import android.text.Editable;import android.text.Selection;import android.text.Spannable;import android.text.TextWatcher;import android.util.AttributeSet;import android.widget.EditText;public class ContainsEmojiEditText extends EditText {    //输入表情前的光标位置    private int cursorPos;    //输入表情前EditText中的文本    private String inputAfterText;    //是否重置了EditText的内容    private boolean resetText;    private Context mContext;    public ContainsEmojiEditText(Context context) {        super(context);        this.mContext = context;        initEditText();    }    public ContainsEmojiEditText(Context context, AttributeSet attrs) {        super(context, attrs);        this.mContext = context;        initEditText();    }    public ContainsEmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        initEditText();    }    // 初始化edittext 控件    private void initEditText() {        addTextChangedListener(new TextWatcher() {            @Override            public void beforeTextChanged(CharSequence s, int start, int before, int count) {                if (!resetText) {                    cursorPos = getSelectionEnd();                    // 这里用s.toString()而不直接用s是因为如果用s,                    // 那么,inputAfterText和s在内存中指向的是同一个地址,s改变了,                    // inputAfterText也就改变了,那么表情过滤就失败了                    inputAfterText= s.toString();                }            }            @Override            public void onTextChanged(CharSequence s, int start, int before, int count) {                if (!resetText) {                    if (count >= 2) {//表情符号的字符长度最小为2                        CharSequence input = s.subSequence(cursorPos, cursorPos + count);                        if (containsEmoji(input.toString())) {                            resetText = true;                            Toast.makeText(mContext, "不支持输入Emoji表情符号", Toast.LENGTH_SHORT).show();                            //是表情符号就将文本还原为输入表情符号之前的内容                            setText(inputAfterText);                            CharSequence text = getText();                            if (text instanceof Spannable) {                                Spannable spanText = (Spannable) text;                                Selection.setSelection(spanText, text.length());                            }                        }                    }                } else {                    resetText = false;                }            }            @Override            public void afterTextChanged(Editable editable) {            }        });    }    /** * 检测是否有emoji表情 * * @param source * @return */    public static boolean containsEmoji(String source) {        int len = source.length();        for (int i = 0; i < len; i++) {            char codePoint = source.charAt(i);            if (!isEmojiCharacter(codePoint)) { //如果不能匹配,则该字符是Emoji表情                return true;            }        }        return false;    }    /** * 判断是否是Emoji * * @param codePoint 比较的单个字符 * @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));    }}
  • xml文件使用方法
<com.liujy.ui.wiget.ContainsEmojiEditText      android:layout_width="match_parent"      android:layout_height="wrap_content" />

源码下载地址

GitHub下载地址

更多相关文章

  1. android与webService的数据传输---数据表=json
  2. Android(安卓)NDK开发之旅38--FFmpeg视频添加水印
  3. Android开发便签9:在android资源文件中定义字符串数组
  4. ROS与Android的通信
  5. Android(安卓)autocompleteTextview自动补齐
  6. Android之TextUtils类介绍
  7. 服务端和Android客户端利用Socket传输JSON数据
  8. 手动root android 模拟器(emulator)详细过程
  9. Android(安卓)EditText密码框中字体和普通的输入框不同

随机推荐

  1. Flink通过异步IO实现redis维表join
  2. 最简单的全年个税计算模板,拿走不谢
  3. 《数据持久化与鸿蒙的分布式数据管理能力
  4. 移动办公服务的未来之路
  5. 新冠肺炎:新增确诊和治愈病例走势图
  6. Capital One 的流线型微服务设计实践
  7. 阿里测试环境运维及研发效率提升之道
  8. EXCEL连通数据库,供应链进度追踪效率倍增
  9. Custom attributes for VM in vCenter
  10. 如何知道 window 的 load 事件已经触发