1. 程式人生 > >Android EditText限制文字長度(中文算3字元,英文算1字元)

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已經存在文字後面,如果不超過限制的話