因项目需求,需要禁止用户输入表情符号,具体如下 ~
EditText相关Blog
TextView、EditText属性大全监听 EditText 文本变化设置 EditText 光标颜色与下划线颜色EditText 禁止输入表情符号EditText 一键清除内容Android实战场景 - 输入手机号、银行卡号、身份证号时动态格式化
Hint:所谓"禁止输入表情符号",也可以理解为"只能输入数字、英文、汉字"
基本认知自定义TextWatcher + 正则过滤三方框架
基本认知
起初我以为有俩种方式可以实现这个功能
第一种键盘弹出不显示表情选项,从根源解决问题
(失败,因为每个手机的Rom烧制都是固定的,很难去操作,主要是水平有限
)第二种正常显示表情选项,但是输入之后EditText进行过滤,不做显示处理,这样我们传输的时候就不会出现错误
后来再回头的看的时候,发现常见的有俩种方式实现我们的需求
通过正则过滤
禁止输入的内容(也就是上方的第二种方式)通过三方框架
做处理,大多实现原理相同
自定义TextWatcher + 正则过滤
限制正则:[^a-zA-Z0-9\u4E00-\u9FA5]
使用方式:etName.addTextChangedListener(LimitInputTextWatcher(etName))
LimitInputTextWatcher(自定义TextWatcher,内部定义了仅支持输入数字、英文、汉字的过滤规则
)-可直接Copy
import android.text.Editable;import android.text.TextWatcher;import android.widget.EditText;public class LimitInputTextWatcher implements TextWatcher {//etprivate EditText et = null;//筛选条件private String regex;//默认的筛选条件(正则:只能输入中文、英文、数字)private String DEFAULT_REGEX = "[^a-zA-Z0-9\u4E00-\u9FA5]";/*** 构造方法** @param et*/public LimitInputTextWatcher(EditText et) {this.et = et;this.regex = DEFAULT_REGEX;}/*** 构造方法** @param et et* @param regex 筛选条件(如果要使用该构造参数,要自定义正则)*/public LimitInputTextWatcher(EditText et, String regex) {this.et = et;this.regex = regex;}@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void afterTextChanged(Editable editable) {String str = editable.toString();String inputStr = clearLimitStr(regex, str);et.removeTextChangedListener(this);// et.setText方法可能会引起键盘变化,所以用editable.replace来显示内容editable.replace(0, editable.length(), inputStr.trim());et.addTextChangedListener(this);}/*** 清除不符合条件的内容** @param regex* @return*/private String clearLimitStr(String regex, String str) {return str.replaceAll(regex, "");}}
借鉴自 - android 利用正则表达式 控制EditText只能输入数字、英文、汉字
方式扩展:以下方法,尚且未测,仅作记录
//昵称仅支持10位字母/数字/中文//限制只能输入中文,英文,数字InputFilter typeFilter = new InputFilter() {@Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {Pattern p = pile("[0-9a-zA-Z|\u4e00-\u9fa5]+");Matcher m = p.matcher(source.toString());if (!m.matches()) return "";return null;}};//如果要限制输入字数,数组中加上new InputFilter.LengthFilter(maxLength)vEtNickName.setFilters(new InputFilter[]{typeFilter, new InputFilter.LengthFilter(10)});
三方框架
查询一些网上的处理方案,有的朋友是通过一些正则过滤
,有的是通过自定义类
去做处理,当然应该都是通过校验实现的,这里我在Github
找到了一个自定义控件
,内置表情处理
,可以直接拿来用,但是要详情使用的话,最好熟悉一下对应的属性信息。
Github作者介绍该自定义控件拥有以下功能
带删除功能的EditText显示或者隐藏密码可设置自动添加分隔符分割电话号码、银行卡号等支持禁止Emoji表情符号输入
关于EditText
的inputType
输入类型,可以直接查看 TextView、EditText属性大全
使用方式
build
compile 'com.xw.repo:xedittext:1.0.6@aar'
Layout
(父布局加入命名空间)
xmlns:app="/apk/res-auto"
设置方式:EditText限制输入信息(有数字,密码等,但不包含表情)
android:inputType=""
EditText(所用代码)
<com.xw.repo.xedittext.XEditTextandroid:layout_width="match_parent"android:layout_height="161dp"android:background="@null"android:gravity="top"android:hint="请分享相关问题"android:paddingLeft="17dp"android:textColor="#999999"android:textSize="13sp"app:x_disableEmoji="true" />
常见功能
禁止表情app:x_disableEmoji="true"
一键清除app:x_disableClear="true"
hint显示位置android:gravity="top"
取消Edit原有的下划线背景android:background="@null"
如有更多需求,可前往另一位Blog友那儿进行查看哦 ~