EditText 表情符号过滤
2016-03-04 11:40
519 查看
import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.Toast; import com.taihe.mplus.util.L; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @outher 孙磊磊 * create at 2016/2/23 17:38 * description 表情过滤 */ public class ValidCharacterListener implements TextWatcher { TextWatcher mListener; EditText editText; //匹配非表情符号的正则表达式 // private final String reg="^[0-9A-Za-z\u4e00-\u9fa50~·!@#¥%……&*()“”‘’:;《》?,。、<>?/.,';\":\\|~`!@#$%^&*()+-=_]*$"; private final String reg = "^[\u4e00-\u9fa5\u0020-\u007E\uFE30-\uFFA0。、……“”‘’《》——¥~]*$"; private Pattern pattern = Pattern.compile(reg); //输入表情前的光标位置 private int cursorPos; //输入表情前EditText中的文本 private String tmp; //是否重置了EditText的内容 private boolean resetText; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (mListener != null) mListener.beforeTextChanged(s, start, count, after); if (!resetText) { cursorPos = editText.getSelectionEnd(); tmp = s.toString();//这里用s.toString()而不直接用s是因为如果用s,那么,tmp和s在内存中指向的是同一个地址,s改变了,tmp也就改变了,那么表情过滤就失败了 } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (mListener != null) mListener.onTextChanged(s, start, before, count); if(count>=0) if (!resetText) { // CharSequence input = s.subSequence(cursorPos, cursorPos + count); //正则匹配是否是表情符号 Matcher matcher = pattern.matcher(s.toString()); if (!matcher.matches()) { resetText = true; //是表情符号就将文本还原为输入表情符号之前的内容 editText.setText(tmp); editText.setSelection(cursorPos); editText.invalidate(); } } else { resetText = false; } } @Override public void afterTextChanged(Editable s) { if (mListener != null) mListener.afterTextChanged(s); } public ValidCharacterListener setEditText(EditText editText) { this.editText = editText; editText.addTextChangedListener(this); tmp = editText.getText().toString(); return this; } public ValidCharacterListener addListener(TextWatcher listener) { this.mListener = listener; return this; } }
相关文章推荐
- 开一个博客,不写给谁看,就是记录一下一个码农的学习路程
- storm源代码分析---Transactional spouts
- [转载]委托与泛型委托
- 一个不会言谈的程序猿,惊奇发现自己能力的多么的优秀
- Zend Framework教程之Zend_Layout布局助手详解
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
- 坑爹的shell 空格
- STL算法之集合
- 【LeetCode】008 Fraction to Recurring Decimal 六点六六六循环
- hd 1070 Milk
- Android binder (2): Parcel
- Android binder (3): Binder 驱动的初始化
- 静态页面中如何传json数据
- macbook 放flash发烫,转html5
- oracle--游标
- Linux系统中操作文件数过多导致的错误解决方法
- Mysql数据库导入Sqlite
- 带参宏定义的一个易错题
- windows 安装 zookeeper 并测试
- 23.1 Windows 套接字