EditText限制中文字符长度

原创 2018年04月16日 16:31:04

        EditText文本输入框,非常常见的一个控件。在使用时常常会限制用户输入的长度,一般来说直接在xml里面设置android:maxlength即可。但有时候有些场景,比如输入名称,可以输入中文和字母,但是中文算两个字符长度,这时设置maxlength可能就不太符合我们的需求了。为了让用户输入足够的字符后不允许输入,就需要使用TextWatcher来对输入进行控制。具体代码如下

/**
 * 限定输入名称长度(中文算两个长)
 */

public class NameWatcher implements TextWatcher {

    private int maxLength = 10;
    private EditText mEditText;

    public NameWatcher(EditText editText, int maxLength) {
        this.mEditText = editText;
        this.maxLength = maxLength;
    }

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

    }

    /**
     * @param s      editText设置的值
     * @param start  光标从哪里开始输入
     * @param before
     * @param count  此次输入的字符长度
     */
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        int totalLength = getWordCount(s.toString());
        if (totalLength > maxLength) {
            //当前输入的字符
            CharSequence input = s.subSequence(start, start + count);
            int inputLength = getWordCount(input.toString());
            //有效字符
            String valid = getLimitString(input, maxLength - (totalLength - inputLength));
            if (start + count == s.length()) {
                //在最末尾添加的字符
                mEditText.setText(String.valueOf(s.subSequence(0, start) + valid));
                mEditText.setSelection(mEditText.getText().length());
            } else {
                //在中间添加的
                mEditText.setText(String.valueOf(s.subSequence(0, start)
                        + valid
                        + String.valueOf(s.subSequence(start + count, s.length()))));
                mEditText.setSelection(start + valid.length());
            }
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    /**
     * 获取字符串长度
     * 由于Java是基于Unicode编码的,因此,一个汉字的长度为1,而不是2。
     * 要以字节单位获得字符串的长度。
     * 例如,“123abc长城”按字节长度计算是10,而按Unicode计算长度是8。为了获得10,
     * 需要从头扫描根据字符的Ascii来获得具体的长度。如果是标准的字符,Ascii的范围是0至255
     * ,如果是汉字或其他全角字符,Ascii会大于255。
     *
     * @param s
     * @return
     */
    public int getWordCount(String s) {
        int length = 0;
        for (int i = 0; i < s.length(); i++) {
            int ascii = Character.codePointAt(s, i);
            if (ascii >= 0 && ascii <= 255)
                length++;
            else
                length += 2;

        }
        return length;
    }

    /**
     * 限制长度的字符
     *
     * @param str
     * @param maxLength
     * @return
     */
    private String getLimitString(CharSequence str, int maxLength) {
        int length = 0;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            int ascii = Character.codePointAt(str, i);
            if (ascii >= 0 && ascii <= 255) {
                if (length < maxLength) {
                    length++;
                    stringBuilder.append(str.charAt(i));
                } else {
                    return stringBuilder.toString();
                }
            } else {
                if (length + 2 <= maxLength) {
                    length += 2;
                    stringBuilder.append(str.charAt(i));
                } else {
                    return stringBuilder.toString();
                }
            }
        }
        return stringBuilder.toString();
    }
}

使用:

mEtName.addTextChangedListener(new NameWatcher(mEtName, 20));

 顺带记录一下,inputType设置为“number”的话是不允许输入空格的,而设置为“phone”则可以输入空格。


验证码之中文验证码

-
  • 1970年01月01日 08:00

Android EditText限制文字长度(中文算3字符,英文算1字符)

/** * 限制输入字符长度 中文算3字符,英文算1字符 */ InputFilter filter = new InputFilter() { fin...
  • u014039918
  • u014039918
  • 2017-06-29 11:19:17
  • 694

Android EditText限制文字长度(中文算2字符,英文算1字符)

其实项目原本使用cocos2dx中的E
  • satanzw
  • satanzw
  • 2014-11-12 22:06:17
  • 4347

EditText限制最大字符数(中文,字母,数字)

限定EditText输入个数的解决方案很多,但是一般主要考虑两点,也就是处理两件事: (1)不同语言字符(英文、中文等)处理方式 (2)输入字符达到数目后,是否仍然允许用户输入 第一点,...
  • Dev_Hanyu
  • Dev_Hanyu
  • 2016-11-07 15:26:54
  • 2263

Android EditText 使用InputFilter区分中文英文字符长度

有时产品经理提的需求,要区分中文英文字符长度,一个中文字符代表两个英文字符,输入时要区分长度。比如40个中文,就是80个英文字符。这种需求,EditText 的length属性就不能用了。我查了一下,...
  • wei1583812
  • wei1583812
  • 2017-03-21 11:30:36
  • 480

限制edittext的最大长度

限制edittext的最大长度EditText可以在XML和代码中设置字数限制。在XML中:Xml代码  android:maxLength=“50”  代码中:Java代码 editText.set...
  • wzz_momo
  • wzz_momo
  • 2011-06-16 11:25:00
  • 3647

EditText限制输入字符串长度

参考博文链接:http://www.cnblogs.com/jason-star/archive/2013/01/01/2841596.html EditText限制字符串输入长度的改动办法: 1、在...
  • tom1988614
  • tom1988614
  • 2015-12-30 15:54:13
  • 6930

限制Edittext输入的字节长度

在给设备重命名时,设备对名字的存储空间一般都是多少字节,而并非多少字,并通常都是采用utf-8的编码。 那问题来了,utf-8的编码是1-6个字节的不等长度,如何获取将一个超过30字节的文本转换到3...
  • u010134293
  • u010134293
  • 2016-10-15 13:09:09
  • 1706

Android EditText输入限制最大字符长度 和 限制只能输入数字和字母(包含大小写)

如题:Android EditText输入限制最大字符长度  和 限制只能输入数字和字母(包含大小写),主要是如下两个属性:             android:maxLength="10" ...
  • omayyouhappy
  • omayyouhappy
  • 2017-05-09 17:38:43
  • 1892

EditText 特殊字符过滤和字符长度限制的最优方法

在android开发中,经常会碰到edittext中特殊字符过滤和字符长度限制同时要求的问题,由于android不同版本之间的兼容问题,以及各种手机支持情况不同,因此,经常会出现一些设备上面不兼容问题...
  • hard_working1
  • hard_working1
  • 2017-02-12 11:12:25
  • 586
收藏助手
不良信息举报
您举报文章:EditText限制中文字符长度
举报原因:
原因补充:

(最多只允许输入30个字)