概述
因项目需求,需要禁止用户输入表情符号,具体如下 ~
EditText相关Blog
- TextView、EditText属性大全
- 监听 EditText 文本变化
- 设置 EditText 光标颜色与下划线颜色
- EditText 禁止输入表情符号
- EditText 一键清除内容
- Android实战场景 - 输入手机号、银行卡号、身份证号时动态格式化
Hint:所谓"禁止输入表情符号",也可以理解为"只能输入数字、英文、汉字"
- 基本认知
- 自定义TextWatcher + 正则过滤
- 三方框架
基本认知
起初我以为有俩种方式可以实现这个功能
- 第一种
键盘弹出不显示表情选项,从根源解决问题
(失败,因为每个手机的Rom烧制都是固定的,很难去操作,主要是水平有限
) - 第二种
正常显示表情选项,但是输入之后EditText进行过滤,不做显示处理,这样我们传输的时候就不会出现错误
后来再回头的看的时候,发现常见的有俩种方式实现我们的需求
- 通过
正则过滤
禁止输入的内容(也就是上方的第二种方式) - 通过
三方框架
做处理,大多实现原理相同
自定义TextWatcher + 正则过滤
限制正则:[^a-zA-Z0-9u4E00-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 {
//et
private EditText et = null;
//筛选条件
private String regex;
//默认的筛选条件(正则:只能输入中文、英文、数字)
private String DEFAULT_REGEX = "[^a-zA-Z0-9u4E00-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;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public 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() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Pattern p = Pattern.compile("[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="http://schemas.android.com/apk/res-auto"
设置方式:EditText限制输入信息(有数字,密码等,但不包含表情)
android:inputType=""
EditText(所用代码)
<com.xw.repo.xedittext.XEditText
android: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友那儿进行查看哦 ~
最后
以上就是纯真皮带为你收集整理的Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号的全部内容,希望文章能够帮你解决Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复