EditText动态限制输入最大字符使用自定义InputFilter

需求

需要限制edittext动态输入最大字节,因不同语言单个文字占用字节不一致,所以原生InputFilter无法满足。
下需要大于规定字节数时保持之前的输入,小于规定字节数时保持输入。

编码

实现InputFilter,自定义filter方法。

public class LengthFilter implements InputFilter {
    int nMax = 0;

    int keep = 0;

    private onMaxLengthListener onMaxLengthListener;

    public LengthFilter(int nMax) {
        this.nMax = nMax;
    }

    public LengthFilter(int nMax, onMaxLengthListener onMaxLengthListener) {
        this.nMax = nMax;
        this.onMaxLengthListener = onMaxLengthListener;
    }


    /**
     * source:新输入字符
     * start:新输入字符起始,一般0
     * end:新输入字符结尾,一般source.length
     * dest:老字符
     * dstart:插入老字符起始位置
     * dend:插入老字符结尾,一般dend=dstart
     *
     * @return null:不修改
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        try {
            String destAdjust = dest.toString();
            String filterString = "";
            if (dstart != dend) {
                String destAdjust1 = dest.toString().substring(0, dstart);
                String destAdjust2 = dest.toString().substring(dend);
                destAdjust = destAdjust1 + destAdjust2;
                filterString = dest.toString().substring(dstart, dend);
                Log.d("LengthFilter", "filter: destAdjust1 = [" + destAdjust1 + "], destAdjust2 = [" + destAdjust2 + "], destAdjust = [" + end + "]");

            }
            keep = nMax - destAdjust.getBytes(StandardCharsets.UTF_8).length - source.toString().getBytes(StandardCharsets.UTF_8).length;
            Log.d("LengthFilter", "filter: source = [" + source + "], start = [" + start + "], end = [" + end + "], dstart = [" + dstart + "]" + ", dend=" + dend + ", keep=" + keep + ", destAdjust=" + destAdjust);
            if (keep < 0) {
                //此已输入的字符大于限定长度nMax
                if (onMaxLengthListener != null) {
                    onMaxLengthListener.onMaxLengthCallBack();
                }
                return filterString;
            } else {
                //此已输入的字符小于限定长度nMax
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    public interface onMaxLengthListener {
        void onMaxLengthCallBack();
    }

    public void setOnMaxLengthListener(onMaxLengthListener onMaxLengthListener) {
        this.onMaxLengthListener = onMaxLengthListener;
    }
}

使用

大于规定长度时,弹窗提示

etApName.setFilters(new InputFilter[]{new LengthFilter(MAX_NAME_LENGTH, () -> SVToast.show(SettingApplication.getContext(), context.getString(R.string.ap_name_tip2), 2000))});
Android中,你可以通过设置`EditText`组件的`Filters`属性来限制用户输入字符长度。`InputFilter`是一个实现了`InputFilter`接口的对象,它可以根据特定规则过滤掉用户的输入。以下是简单的步骤: 1. 创建一个自定义的`InputFilter`实现,例如`LengthLimitingFilter`: ```java public class LengthLimitingFilter implements InputFilter { private int maxLength; public LengthLimitingFilter(int maxLength) { this.maxLength = maxLength; } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() > maxLength) { return source.subSequence(0, maxLength); } return null; // 表示没有过滤,允许输入 } } ``` 2. 在创建`EditText`时,将其`Filters`设置为你刚才创建的限制器,以及可能需要的其他过滤器: ```xml <EditText android:id="@+id/limitEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" android:maxLength="20" <!-- 设置最大输入长度 --> android:filters="@array/input_filters" <!-- 假设数组名为@array/input_filters --> /> ``` 3. 在XML布局文件或者其他地方初始化时,动态添加过滤器: ```java ArrayAdapter<InputFilter> filterAdapter = new ArrayAdapter<>(context, R.array.input_filters, 0); filterAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); editText.setFilters(filterAdapter.getArray()); ``` 4. 在`arrays.xml`或类似资源文件中定义过滤器列表: ```xml <integer-array name="input_filters"> <item>@integer/max_length_filter</item> </integer-array> <resources> <integer name="max_length_filter">com.example.LengthLimitingFilter#20</integer> </resources> ``` 现在,当用户尝试在EditText输入超过设定长度的字符时,输入会被截断或者阻止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值