【Android】EditText根据第一个输入字符设置不同的最大输入长度

1、前言

有这样一个需求,如果输入框第一个字符为“8”则设置EditText的最大输入长度为13,如果输入框前两个字符为“08”则设置EditText的最大输入长度为14。

2、思路

监听输入框的输入文字,根据输入文字来判断设置最大输入长度。

3、上代码

3.1  实现输入框输入监听接口

/**
 *
 * 处理手机输入框 的长度限制
 * 1、8开头的输入框限制输入13位
 * 2、08以及其他开头的输入框限制输入14位
 */

public class PhoneTextWatcher implements TextWatcher {

    /**
     * 限制登录账号08开头最大长度14
     */
    public static final int PHONE_FOURTEEN_LENGTH = 14;
    /**
     * 限制登录账号8开头最大长度13
     */
    public static final int PHONE_THIRTEEN_LENGTH = 13;
    /**
     * 以8开头
     */
    private static final String START_8 = "8";
    /**
     * 是否需要更新filter
     * 每次清空EditText上的文字之后,该标记置为true
     * 防止每次修改一个字符就需要设置filter一次
     */
    private boolean changeFilter = true;

    private InputFilter.LengthFilter phoneThirteenFilter = null;
    private InputFilter.LengthFilter phoneFourteenFilter = null;

    private EditText editText;
    public PhoneTextWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        String account = editText.getText().toString();
        if (!TextUtils.isEmpty(account) && changeFilter) {
            if (account.startsWith(START_8)) {
                addFilter(getThirteenFilter());
            } else {
                addFilter(getFourteenFilter());
            }
            changeFilter = false;
        }else if (TextUtils.isEmpty(account)){
            changeFilter = true;
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    /**
     * 添加过滤
     * @param filter
     */
    private void addFilter(InputFilter.LengthFilter filter) {
        //获取EditText已有的filters[]
        InputFilter[] filters = editText.getFilters();
        //如果EditText没有filters[] 直接为EditText设置filter
        if (filters == null || filters.length == 0){
            editText.setFilters(new InputFilter[]{filter});
            return;
        }
        //如果EditText有LengthFilter类型的filter  直接替换为我们自己的filter
        boolean hasLengthFilter = false;
        for (int i = 0; i < filters.length; i++) {
            if (filters[i] instanceof  InputFilter.LengthFilter){
                hasLengthFilter = true;
                filters[i] = filter;
                continue;
            }
        }
        //替换为我们自己的filter成功,需要给Editable 设置修改之后的filter[]
        //如果EditText没有LengthFilter类型的filter ,直接给EditText设置filter
        if (hasLengthFilter){
            editText.setFilters(filters);
        }else{
            editText.setFilters(new InputFilter[]{filter});
        }
    }

    /**
     * 获取长度为13的filter
     * @return
     */
    private InputFilter.LengthFilter getThirteenFilter(){

        if (phoneThirteenFilter == null) {
            phoneThirteenFilter = new InputFilter.LengthFilter(PHONE_THIRTEEN_LENGTH);
        }
        return phoneThirteenFilter;
    }

    /**
     * 获取长度为14的filter
     * @return
     */
    private InputFilter.LengthFilter getFourteenFilter(){

        if (phoneFourteenFilter == null) {
            phoneFourteenFilter = new InputFilter.LengthFilter(PHONE_FOURTEEN_LENGTH);
        }
        return phoneFourteenFilter;
    }
}

构造函数传入EditText,方便获取和设置filter

  private EditText editText;
    public PhoneTextWatcher(EditText editText) {
        this.editText = editText;
    }

添加过滤器:

首先从EditText获取已有的fileter[ ] ,如果长度为0说明还没有设置过任何的filter,此时直接设置我们的filter即可。

如果数组不为空,则判断数组内是否已经有限制长度的LengthFilter ,如果没有直接添加我们的filter即可,

如果有则直接把我们的filter赋值过去,然后更新一下修改过去的filter[]到Editable即可。

/**
     * 添加过滤
     * @param filter
     */
    private void addFilter(InputFilter.LengthFilter filter) {
        //获取EditText已有的filters[]
        InputFilter[] filters = editText.getFilters();
        //如果EditText没有filters[] 直接为EditText设置filter
        if (filters == null || filters.length == 0){
            editText.setFilters(new InputFilter[]{filter});
            return;
        }
        //如果EditText有LengthFilter类型的filter  直接替换为我们自己的filter
        boolean hasLengthFilter = false;
        for (int i = 0; i < filters.length; i++) {
            if (filters[i] instanceof  InputFilter.LengthFilter){
                hasLengthFilter = true;
                filters[i] = filter;
                continue;
            }
        }
        //替换为我们自己的filter成功,需要给Editable 设置修改之后的filter[]
        //如果EditText没有LengthFilter类型的filter ,直接给EditText设置filter
        if (hasLengthFilter){
            editText.getText().setFilters(filters);
        }else{
            editText.setFilters(new InputFilter[]{filter});
        }
    }

3.2 使用

phoneEditText.addTextChangedListener(new PhoneTextWatcher(phoneEditText) {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //父类根据输入内容处理输入框的长度
                super.onTextChanged(s, start, before, count);
                //其他自己的逻辑
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

使用时,直接把new一个对象放入EditText的监听方法中。

注意:调用父类的onTextChanged()方法,这样父类的设置最大长度才能生效。

 public void onTextChanged(CharSequence s, int start, int before, int count) {
                //父类根据输入内容处理输入框的长度
                super.onTextChanged(s, start, before, count);
                //其他自己的逻辑
            }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值