Android 限制 EditText 只能輸入英文加漢字

前言

在實(shí)際的開發(fā)當(dāng)中,如果有一個(gè)需求是:

  1. 輸入框中只能輸入中文或者是英文亦或者是中英混合
  2. 如果是純英文,長度限制是12,其他情況限制為6。
分析

當(dāng)你看完上面的需求時(shí),是不是有種想法想提刀斬需求方? WTF !

大胸弟,莫雞凍。

我們先想想,有神碼方法是可以限制輸入框上輸入的呢?哎,好像有個(gè)叫inputType的屬性哦。。。可是翻遍了所有的屬性,都沒有我們所需要的啊 !

android:inputType="text|textCapWords|number|textPassword|..."

好吧,既然沒有,在看看有沒有其他的屬性咯.

android:digits="0123456789"

這個(gè)屬性,好像是可以的 ? 但是這個(gè)屬性是只允許輸入的是digits里面所定義的所有規(guī)則 , 如果我要輸入的是中英文 , 要怎樣去寫里面的規(guī)則呢 ? 很明顯這個(gè)屬性里面的值是不支持正則表達(dá)式的,所有無法完成。

有人會(huì)說 , 不能在用戶輸入內(nèi)容后再在處理時(shí)判斷嗎 ? Are you kidding me ? 你做不好事情 , 到時(shí)候可能就是需求方找你麻煩了.不過又給了你一個(gè)接觸他kan他的機(jī)會(huì)了, 珍重 !

做法

有的人說 , 用TextWatcher來監(jiān)聽輸入 , 然后判斷是否是需要的 , 不需要的就用空的字符串替換掉 , 然后把光標(biāo)移動(dòng)到相應(yīng)的位置 , 這種方式有興趣的朋友可以試試 .

下面我說說我的做法 :
其實(shí)google大佬是很聰明的啦 , 神碼都為我們想好了 , EditText 中有個(gè)方式是

setFilters(InputFilter[] InputFilter)

我們可以用這個(gè)方法做很多事情的 , 比如上面所說的限制只能輸入中英文 .

首先定義一個(gè)InputFilter

InputFilter typeFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            Pattern p = Pattern.compile("[a-zA-Z|\u4e00-\u9fa5]+");
            Matcher m = p.matcher(source.toString());
            if (!m.matches()) return "";
            return null;
        }
    };

里面的內(nèi)容也是一看就能明白的 , 其中如果需要輸入該字符串的話就返回null , 如果要過濾掉(不要)的話就返回空字符串 .

然后再設(shè)置 :

editText.setFilters(new InputFilter[]{typeFilter});
注意

這里有個(gè)注意的地方是 , 如果設(shè)置了inputFilter , 那么在布局中設(shè)置的maxLength屬性就會(huì)失效 , 那么怎樣去限制它的長度呢 ?

如果是統(tǒng)一的長度的話 , 直接設(shè)置即可 .

editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)});

如果想需求中的根據(jù)每種情況設(shè)置不同的長度限制怎么辦 ? 那就自己寫唄 .

private static class SizeFilterWithTextAndLetter implements InputFilter {

        private int mMaxLength;
        private int onlyLetterLength;
        private int normalLength;

        private boolean hasChinese;

        Pattern p = Pattern.compile("[\u4e00-\u9fa5]+");
        Matcher m;

        private SizeFilterWithTextAndLetter(int onlyLetterLength,int normalLength) {
            this.normalLength = normalLength;
            this.onlyLetterLength = onlyLetterLength;
        }

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (!hasChinese && dest.length() <= normalLength) {
                if (dest.length() >= normalLength) {
                    m = p.matcher(dest.toString());
                } else {
                    String tmp = source.toString() + dest.toString();
                    if (tmp.length() >= normalLength) {
                        tmp = tmp.substring(0,normalLength);
                    }
                    m = p.matcher(tmp);
                }
                hasChinese = m.find();
                mMaxLength = hasChinese ? normalLength : onlyLetterLength;
            }
            if (mMaxLength == onlyLetterLength) {
                m = p.matcher(source);
                if (m.find()) return "";
            }

            int keep = mMaxLength - (dest.length() - (dend - dstart));
            if (keep <= 0) {
                return "";
            } else if (keep >= end - start) {
                return null;
            } else {
                keep += start;
                if (Character.isHighSurrogate(source.charAt(keep - 1))) {
                    --keep;
                    if (keep == start) {
                        return "";
                    }
                }
                return source.subSequence(start, keep);
            }
        }
    }

然后

editText.setFilters(new InputFilter[]{new SizeFilterWithTextAndLetter(12,6)});

大功告成 !!!

附上demo地址吧 , 需要的就看看咯 .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,981評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評(píng)論 25 708
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,178評(píng)論 6 13
  • 莫扎特。天才都沒有童年,經(jīng)典的是小時(shí)候的神童變成了成年的大師,免去了我們傷仲永的哀嘆。1762年6歲的他和姐姐被抱...
    深海的雨閱讀 418評(píng)論 0 1
  • Given a non-negative integer num, repeatedly add all its ...
    a_void閱讀 161評(píng)論 0 0