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)});
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章