1. 程式人生 > >Android EditText 讓編輯框只能輸入漢字

Android EditText 讓編輯框只能輸入漢字

最近在專案中,有遇到“讓編輯框只能輸入漢字”這種需求,然後上網看了一下,解決方法大致是兩種,一種是自定義了一個EditText,然後重寫commitText方法,實現限制輸入漢字的方法,例如:

/**
* 對輸入的內容進行攔截
*
* @param text
* @param newCursorPosition
* @return
*/
@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
    // 只能輸入漢字
    if (!isChinese(text.toString())) {
        return false;
    }
    return super.commitText(text, newCursorPosition);
}

另一種是在所有的輸入都完成後,檢查EditText裡面的字元是否都是漢字,這種就不舉例了。

其實實現這種需求還有第三種方式,通過使用Android原始碼中的InputFilter介面可以非常簡單的實現這個功能。

InputFilter filter = new InputFilter() {
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                for (int i = start; i < end; i++) {
                    if (!isChinese(source.charAt(i))) {
                        return "";
                    }
                }
                return null;
            }
        };
實現介面中的filter方法,然後把它設定到EditText元件上,就可以實現此需求了。
et_chinese.setFilters(new InputFilter[]{filter});
然後InputFilter介面中還有個靜態類LengthFilter可以實現對編輯框輸入字元數量的控制。
//如果想要再實現輸入字元數量的限制,可以這麼寫,如果限制字元數為6,就在LengthFilter中傳入引數6
et_chinese.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(6)});
 程式碼中的isChinese方法來自:
點選開啟連結
/**
* 判定輸入漢字
*
* @param c
* @return
*/
public static boolean isChinese(char c) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
    if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
         || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
         || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
         || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
         || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
         || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
         return true;
    }
    return false;
}

最後放出DEMO位置:點選前往