Android Edittext进行字符限制

作者: kotlin 发布时间: 2019-08-03 浏览: 755 次 编辑

在工作中,根据需求,EditText对输入的内容进行20个字符的限制,一个汉字占两个字符,一个字母占一个字符,当已经输入19个字符的时候,不可以输入汉字,但是还可以输入一个字母。如果输入超过20个字符,进行截取20个字符。以下是网上大神的工具类,我这边根据自己需求修改。(其中的20个可以随意的修改)


1,创建工具类

package com.zhzd.youde.util;

import android.text.InputFilter;
import android.text.Spanned;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * author: xiaocheng
 * date: 2019-08-03 11:00
 */
public class CharLengthFilter implements InputFilter {
    private int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母
    private String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字

    public CharLengthFilter(int mAX_EN) {
        super();
        MAX_EN = mAX_EN;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        int destCount = dest.toString().length() + getChineseCount(dest.toString());
        int sourceCount = source.toString().length() + getChineseCount(source.toString());
        String name = "";
        int count = 0;
        int i = 0;
        if (destCount + sourceCount > MAX_EN) {
            if (destCount < MAX_EN) {
                while (!(destCount + count >= MAX_EN)) {
                    ++i;
                    name = source.subSequence(0, i).toString();
                    count = name.toString().length() + getChineseCount(name.toString());
                    if (destCount + count > MAX_EN) {
                        --i;
                    }
                }
                return i == 0 ? "" : source.subSequence(0, i).toString();
            }
            return "";
        } else {
            return source;
        }
    }

    private int getChineseCount(String str) {
        int count = 0;
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while (m.find()) {
            count++;
        }
        return count;
    }
}


2.在需要的地方只需要添加上这两句即可(其中的testEt是你自己的EditText):

InputFilter[] filters = {new CharLengthFilter(20)};
testEt.setFilters(filters);


ok,大功告成,赶快试试吧