Android EditText控制输入字符限制的方法

EditText控制输入字符限制的方法

1 EditText的inputType属性

inputType属性用于设置EditText的输入类型,如number,只能输入数字,软键盘为数字键盘

1.1 EditText的inputType属性的设置
  • xml中设置
//……表示其他省略属性
    <EditText ……
       android:digits="0123456789"
       android:inputType="number"
       android:maxLength="11" 
       ……/>
  • java代码中设置
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
1.2 inputType属性中常用的值
xml中java中说明
textInputType.TYPE_CLASS_TEXT文本
numberInputType.TYPE_CLASS_NUMBER数字,整数
numberDecimalInputType.TYPE_NUMBER_FLAG_DECIMAL数字可以输入小数点
textPasswordInputType.TYPE_TEXT_VARIATION_PASSWORD密码输入
1.3 inputType属性可以控制的用户体验
  • 对输入字符的限制,如number,只能输入数字,不能输入其他字符
  • 软键盘的显示,如number,显示的都是数字,方便用户输入

2 EditText的digits属性

digits属性用于设置EditText可以输入的字符集合,如"0123456789",只能输入数字

1.1 digits属性的设置
  • 只能在xml中设置
//……表示其他省略属性
    <EditText ……
       android:digits="0123456789"
       android:inputType="number"
       android:maxLength="11" 
       ……/>
1.2 digits常用的集合
  • 只允许输入数字,可用于手机号的输入: android:digits="0123456789"
  • 只允许输入数字和英文字母 ,可用于密码的输入:
    android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  • 只允许输入数字,英文字母和@.两个符号,可用于邮箱的输入:android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@."

3 EditText的maxLength属性

maxLength属性用于设置EditText的最大长度

  • xml中设置
//……表示其他省略属性
    <EditText ……
       android:digits="0123456789"
       android:inputType="number"
       android:maxLength="11" 
       ……/>
  • java代码中设置
 editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(11) });

4 EditText设置InputFilter过滤规则

InputFilter设置EditText文本过滤规则

4.1 系统提供的InputFilter的实现
//将所有的小写字符转化成大写
public static class AllCaps implements InputFilter
//对输入字符的最大长度做限制,对应 android:maxLength属性
public static class LengthFilter implements InputFilter 

//一些InputType类型的字符限制基类
public abstract class NumberKeyListener extends BaseKeyListener
    implements InputFilter
4.2 自定义InputFilter

InputFilter接口

editText.setFilters(new InputFilter[]{new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        Log.e(TAG, "filter-->source:" + source.toString() + " ,start:" + start + " ,end:" + end + " ;dest:" + dest.toString() + " ,dstart:" + dstart + " ,dend:" + dend);
        return null;
    }
}});

输入hello,删除hello。log如下

//输入hello
filter-->source:h ,start:0 ,end:1 ;dest: ,dstart:0 ,dend:0
filter-->source:he ,start:0 ,end:2 ;dest:h ,dstart:0 ,dend:1
filter-->source:hel ,start:0 ,end:3 ;dest:he ,dstart:0 ,dend:2
filter-->source:hel ,start:0 ,end:3 ;dest:hel ,dstart:0 ,dend:3
filter-->source:hell ,start:0 ,end:4 ;dest:hel ,dstart:0 ,dend:3
filter-->source:hell ,start:0 ,end:4 ;dest:hell ,dstart:0 ,dend:4
filter-->source:hello ,start:0 ,end:5 ;dest:hell ,dstart:0 ,dend:4
//删除hello
filter-->source:hell ,start:0 ,end:4 ;dest:hello ,dstart:0 ,dend:5
filter-->source:hel ,start:0 ,end:3 ;dest:hell ,dstart:0 ,dend:4
filter-->source:hel ,start:0 ,end:3 ;dest:hel ,dstart:0 ,dend:3
filter-->source:he ,start:0 ,end:2 ;dest:hel ,dstart:0 ,dend:3
filter-->source:he ,start:0 ,end:2 ;dest:he ,dstart:0 ,dend:2
filter-->source:h ,start:0 ,end:1 ;dest:he ,dstart:0 ,dend:2
filter-->source: ,start:0 ,end:0 ;dest:h ,dstart:0 ,dend:1

5 设置TextWather监听EditText的文本变化

TextWather监听EditText的字符变化

editText.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         Log.e(TAG, "beforeTextChanged-->s:" + s.toString() + " ,start:" + start + " ,count:" + count + ",after:" + after);
     }

     @Override
     public void onTextChanged(CharSequence s, int start, int before, int count) {
         Log.e(TAG, "onTextChanged-->s:" + s.toString() + " ,start:" + start + " ,before:" + before + ",count:" + count);
     }

     @Override
     public void afterTextChanged(Editable s) {
         Log.e(TAG, "afterTextChanged-->s:" + s.toString());
     }
 });

输入hello,删除hello。log如下

//输入hello
beforeTextChanged-->s: ,start:0 ,count:0,after:1
onTextChanged-->s:h ,start:0 ,before:0,count:1
afterTextChanged-->s:h
beforeTextChanged-->s:h ,start:0 ,count:1,after:2
onTextChanged-->s:he ,start:0 ,before:1,count:2
afterTextChanged-->s:he
beforeTextChanged-->s:he ,start:0 ,count:2,after:3
onTextChanged-->s:hel ,start:0 ,before:2,count:3
afterTextChanged-->s:hel
beforeTextChanged-->s:hel ,start:0 ,count:3,after:3
onTextChanged-->s:hel ,start:0 ,before:3,count:3
afterTextChanged-->s:hel
beforeTextChanged-->s:hel ,start:0 ,count:3,after:4
onTextChanged-->s:hell ,start:0 ,before:3,count:4
afterTextChanged-->s:hell
beforeTextChanged-->s:hell ,start:0 ,count:4,after:4
onTextChanged-->s:hell ,start:0 ,before:4,count:4
afterTextChanged-->s:hell
beforeTextChanged-->s:hell ,start:0 ,count:4,after:5
onTextChanged-->s:hello ,start:0 ,before:4,count:5
afterTextChanged-->s:hello
//删除hello
beforeTextChanged-->s:hello ,start:4 ,count:1,after:0
onTextChanged-->s:hell ,start:4 ,before:1,count:0
afterTextChanged-->s:hell
beforeTextChanged-->s:hell ,start:3 ,count:1,after:0
onTextChanged-->s:hel ,start:3 ,before:1,count:0
afterTextChanged-->s:hel
beforeTextChanged-->s:hel ,start:2 ,count:1,after:0
onTextChanged-->s:he ,start:2 ,before:1,count:0
afterTextChanged-->s:he
beforeTextChanged-->s:he ,start:1 ,count:1,after:0
onTextChanged-->s:h ,start:1 ,before:1,count:0
afterTextChanged-->s:h
beforeTextChanged-->s:h ,start:0 ,count:1,after:0
onTextChanged-->s: ,start:0 ,before:1,count:0
afterTextChanged-->s:

6 自定义EditText实现InputConnection

TextView实现下面两个方法来控制文本显示

//View.java
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return null;
    }
public boolean onCheckIsTextEditor() {
        return false;
    }

可以实现自己的InputConnection 来控制字符,InputConnection接口定义了很多方法,这个已经很硬核,上面的方法已经能解决我们的问题了,这个知道就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值