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

    /**
     * 限制输入字符长度   中文算3字符,英文算1字符
     */
    InputFilter filter = new InputFilter() {
        final int maxLen = 21;
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            // TODO Auto-generated method stub
            int dindex = 0;
            int count = 0;

            while (count <= maxLen && dindex < dest.length()) {
                char c = dest.charAt(dindex++);
                if (c < 128) {
                    count = count + 1;
                } else {
                    count = count + 3;
                }
            }

            if (count > maxLen) {
                return dest.subSequence(0, dindex - 1);
            }

            int sindex = 0;
            while (count <= maxLen && sindex < source.length()) {
                char c = source.charAt(sindex++);
                if (c < 128) {
                    count = count + 1;
                } else {
                    count = count + 3;
                }
            }

            if (count > maxLen) {
                sindex--;
            }

            return source.subSequence(0, sindex);
        }
    };
EditText editText=(EditText)findViewById(R.id.edit_text);
editText.setFilters(new InputFilter[]{filter});

这里实际上就是判断一下,英文ascii码值都是128以下,这里只要通过这个区分,来做个限制即可。

CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend)

这个接口的参数,一开始混淆了好久

src是当前输入的文字,start和end我压根就没用到,就是输入字符的起始和终止长度

dest是当前已经显示的文字,dstart和dend含义一样,我也没用到

在我使用的过程中,使用start/end和dstart/dend就要加强判断sindex和dindex是否超过长度,比较麻烦,所以就直接使用src.length和dest.length了

最后返回的字符串,就是会添加在当前editbox已经存在文字后面,如果不超过限制的话

你可能感兴趣的:(Android)