Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号

EditText相关Blog

Hint:所谓"禁止输入表情符号",也可以理解为"只能输入数字、英文、汉字"

基本认知
起初我以为有俩种方式可以实现这个功能

第一种 键盘弹出不显示表情选项,从根源解决问题(失败,因为每个手机的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 {
    //et
    private 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;
    }
 
    @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表情符号输入

关于EditTextinputType输入类型,可以直接查看 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友那儿进行查看哦 ~


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_20451879/article/details/78319915

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值