EditeText的maxlength中文、字符长度限制

来源:互联网 发布:快压mac版 编辑:程序博客网 时间:2024/05/01 09:17

一直以为在xml布局文件中对EditText添加 android:maxLength="30";属性是控制EditText字符数的。想当然的以为一个中文占2个字符,一个英文占1个字符。结果的结果当然不是了。

确切的说来android:maxLength="30"是对EditText的字数进行控制的。不管中文还是英文。都是30个字。这下麻烦了,查了整个API就没发现有真正是对字符进行控制的。最后发现只能用自定义的InputFilter来实现


package com.example.inputfilterdemo; import java.util.regex.Matcher;import java.util.regex.Pattern; import android.app.Activity;import android.os.Bundle;import android.text.Editable;import android.text.InputFilter;import android.text.Spanned;import android.text.TextWatcher;import android.util.Log;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast; /** *  * ClassName:MainActivity *  * @author Jerome Song * @version * @since Ver 1.1 * @Date 2013 2013-4-4 下午2:55:42 *  * @see */public class MainActivity extends Activity {     private EditText etTest;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }     private void init() {        etTest = (EditText) findViewById(R.id.et_test);        InputFilter[] filters = { new NameLengthFilter(16) };        etTest.setFilters(filters);    }     private class NameLengthFilter implements InputFilter {        int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母        String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字         public NameLengthFilter(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());            if (destCount + sourceCount > MAX_EN) {                Toast.makeText(MainActivity.this, getString(R.string.count),                        Toast.LENGTH_SHORT).show();                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()) {                for (int i = 0; i <= m.groupCount(); i++) {                    count = count + 1;                }            }            return count;        }    } }


0 0
原创粉丝点击