AndroidUI——InputFilter的使用(3)

在项目中经常会遇到限制EditText输入长度的需求,这个很好解决,设置maxLength属性就行了;但是偶尔会遇到限制长度的升级版:中文算两个字符。比如说这个输入框最多可以输入16个英文字符或8个中文,如果中英文混合输入,那么中文数*2+英文数要小于等于16。

布局文件内容不变

LengthFilter.java

package com.wind.demo;

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

public class LengthFilter implements InputFilter {
    private static final int ASCII = 1; //英文字符长度
    private static final int OTHER = 2; //其他字符长度

    private final int mMaxLength; //可输入的最大长度

    public LengthFilter(int maxLength) {
        mMaxLength = maxLength;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        int keep = mMaxLength - countStringLength(dest); //计算剩余可输入的长度
        if(keep <= 0) { //剩余可输入的长度不大于0,返回空字符
            return "";
        } else if(keep >= countStringLength(source)) { //剩余可输入的长度大于输入字符串的长度,不做过滤处理,使用原来的输入字符串
            return null;
        } else { //输入字符串的长度大于剩余可输入的长度
            int index = countCutIndex(keep, source); //计算截断输入字符串的位置
            return source.subSequence(0, index); //返回截断后的字符串
        }
    }

    /**
     * 计算输入字符串的截断位置
     * */
    private int countCutIndex(int keep, CharSequence source) {
        int length = 0;
        for(int i = 0; i < source.length(); i++) {
            char c = source.charAt(i);
            length += countCharLength(c);
            if(length > keep) {
                return i;
            }
        }
        return source.length() - 1;
    }

    /**
     * 计算字符串的长度
     * */
    private int countStringLength(CharSequence str) {
        if(str == null) {
            return 0;
        }

        int length = 0;
        for(int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            length += countCharLength(c);
        }
        return length;
    }

    /**
     * 计算字符的长度
     * */
    private int countCharLength(char c) {
        if(33 <= c && c <= 126) { //英文字符值的范围
            return ASCII;
        } else {
            return OTHER;
        }
    }
}

MainActivity.java

package com.wind.demo;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText) findViewById(R.id.edittext);
        editText.setFilters(new InputFilter[]{new LengthFilter(16)});
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章