许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Android EditText动态限制输入最大字符:自定义InputFilter实现

Android EditText动态限制输入最大字符:自定义InputFilter实现

阅读数 1
点赞 0
article_banner

需求

需要限制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))});

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空