Android EditText限制輸入字符的5種實現(xiàn)方式

本文轉(zhuǎn)載自:http://blog.csdn.net/brycegao321/article/details/52277255

最近項目要求限制密碼輸入的字符類型, 例如不能輸入中文盔夜。 現(xiàn)在總結(jié)一下EditText的各種實現(xiàn)方式, 以比較各種方法的優(yōu)劣睡扬。

第一種方式:

設(shè)置EditText的inputType屬性,可以通過xml或者java文件來設(shè)置黍析。假如我要設(shè)置為顯示密碼的形式,可以像下面這樣設(shè)置:

在xml中屎开, android:inputType="textPassword"

在java文件中阐枣,可以用 ev.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

inputType參數(shù)有phone、textPasswrod等等屬性奄抽, 有興趣的話可以測試一下蔼两。

image

第二種:

設(shè)置EditText的android:digits 屬性, 這種方式可以指出要支持的字符逞度。比如要限制只能輸入數(shù)字和字母额划,可以這樣:

android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。 PS:吐槽一下档泽,寫著好累俊戳,

不支持

區(qū)間操作符~或-

第三種:

使用TextWather監(jiān)聽EditText的字符變化, 當(dāng)內(nèi)容改變時刪掉不想要的字符馆匿。說白了就是用戶可以隨便按鍵盤抑胎,在代碼里馬上刪掉非法字符。 PS: 常見的搜索功能輸入框就是用TextWatcher監(jiān)測關(guān)鍵詞變化渐北,然后查數(shù)據(jù)并顯示出來了阿逃。示例代碼:只能輸入字母或者數(shù)字, 如果要支持其它字符可以修改regEx正則表達(dá)式。

evPwd = (EditText) findViewById(R.id.ev_password);
evPwd.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        String editable = evPwd.getText().toString();
        String regEx = "[^a-zA-Z0-9]";  //只能輸入字母或數(shù)字
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(editable);
        String str = m.replaceAll("").trim();    //刪掉不是字母或數(shù)字的字符
        if(!editable.equals(str)){
            evPwd.setText(str);  //設(shè)置EditText的字符
            evPwd.setSelection(str.length()); //因為刪除了字符恃锉,要重寫設(shè)置新的光標(biāo)所在位置
        }
    }

第四種:

通過InputFilter來實現(xiàn)搀菩。實現(xiàn)InputFilter過濾器, 需要覆蓋一個叫filter的方法破托。

public abstract CharSequence filter ( 
    CharSequence source,  //輸入的文字 
    int start,  //開始位置 
    int end,  //結(jié)束位置 
    Spanned dest, //當(dāng)前顯示的內(nèi)容 
    int dstart,  //當(dāng)前開始位置 
    int dend //當(dāng)前結(jié)束位置 
);

注意: IntentFilter是個數(shù)組肪跋, 也就是說可以寫多個過濾條件!
下面的實現(xiàn)使得EditText只接收字符(數(shù)字炼团、字母)澎嚣,Character.isLetterOrDigit會把中文也當(dāng)做Letter, 所以要在寫個正則判斷是否中文瘟芝。

evPwd.setFilters(new InputFilter[]{
    new InputFilter() {
        @Override
        public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
            String regex = "^[\u4E00-\u9FA5]+$";
            boolean isChinese = Pattern.matches(regex, charSequence.toString());
            if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese) {
                return "";
            }
            return null;
        }
    }
});

第五種: 使用EditText的InputConnection屬性限制輸入字符易桃。 新建個類繼承于EditText并覆蓋onCreateInputConnection函數(shù), 在xml里使用LimitText替換EditText锌俱。

public class LimitEditText extends EditText {
    public LimitEditText(Context context) {
        super(context);
    }

    public LimitEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 輸入法
     * @param outAttrs
     * @return
     */
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new InnerInputConnecttion(super.onCreateInputConnection(outAttrs),
                false);
    }

    class InnerInputConnecttion extends InputConnectionWrapper implements InputConnection {

        public mInputConnecttion(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        /**
         * 對輸入的內(nèi)容進(jìn)行攔截
         *
         * @param text
         * @param newCursorPosition
         * @return
         */
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            // 只能輸入字母或者數(shù)字
            if (!Character.isLetterOrDigit(charSequence.charAt(i)) || isChinese)  {
                return false;
            }
            return super.commitText(text, newCursorPosition);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean setSelection(int start, int end) {
            return super.setSelection(start, end);
        }
    }
}
以上是EditText輸入限制的所有方法晤郑, 如有遺漏歡迎補(bǔ)充~~~
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贸宏,隨后出現(xiàn)的幾起案子造寝,更是在濱河造成了極大的恐慌,老刑警劉巖吭练,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫龙,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲫咽,警方通過查閱死者的電腦和手機(jī)签赃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來分尸,“玉大人锦聊,你說我怎么就攤上這事÷嵘埽” “怎么了孔庭?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長材蛛。 經(jīng)常有香客問我圆到,道長,這世上最難降的妖魔是什么卑吭? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任构资,我火速辦了婚禮,結(jié)果婚禮上陨簇,老公的妹妹穿的比我還像新娘吐绵。我一直安慰自己迹淌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布己单。 她就那樣靜靜地躺著唉窃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纹笼。 梳的紋絲不亂的頭發(fā)上纹份,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音廷痘,去河邊找鬼蔓涧。 笑死,一個胖子當(dāng)著我的面吹牛笋额,可吹牛的內(nèi)容都是我干的元暴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兄猩,長吁一口氣:“原來是場噩夢啊……” “哼茉盏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枢冤,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸠姨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淹真,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讶迁,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年核蘸,在試婚紗的時候發(fā)現(xiàn)自己被綠了巍糯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡值纱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坯汤,到底是詐尸還是另有隱情虐唠,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布惰聂,位于F島的核電站疆偿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搓幌。R本人自食惡果不足惜杆故,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溉愁。 院中可真熱鬧处铛,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至家肯,卻和暖如春龄砰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讨衣。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工换棚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人反镇。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓固蚤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愿险。 傳聞我的和親對象是個殘疾皇子颇蜡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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