關(guān)于EditText的一些操作擴(kuò)展

相關(guān)方法如下:

import android.content.Context
import android.text.Editable
import android.text.InputFilter
import android.text.InputType
import android.text.TextUtils
import android.text.TextWatcher
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import com.szhg9.magicworkep.common.utils.EditTextUtils
import org.jetbrains.anko.collections.forEachWithIndex

/**
 * 過濾emoji
 */
fun EditText.filterEmoji() {
    var arrys = arrayOfNulls<InputFilter>(filters.size+1)
    filters.forEachWithIndex { index, inputFilter ->
        arrys[index] = inputFilter
    }
    arrys[filters.size] = EditTextUtils.getInputFilterProhibitEmoji()
    filters = arrys
}

/**
 * 過濾標(biāo)點(diǎn)
 */
fun EditText.filterSp() {
    var arrys = arrayOfNulls<InputFilter>(filters.size+1)
    filters.forEachWithIndex { index, inputFilter ->
        arrys[index] = inputFilter
    }
    arrys[filters.size] = EditTextUtils.getInputFilterProhibitSP()
    filters = arrys
}

/**
 * 過濾emoji和標(biāo)點(diǎn)
 */
fun EditText.filterSpAndEmoji() {
    var arrys = arrayOfNulls<InputFilter>(filters.size+2)
    filters.forEachWithIndex { index, inputFilter ->
        arrys[index] = inputFilter
    }
    arrys[filters.size] = EditTextUtils.getInputFilterProhibitSP()
    arrys[filters.size+1] =  EditTextUtils.getInputFilterProhibitEmoji()
    filters = arrys
}

/**
 * 對(duì)輸入的金額進(jìn)行格式化處理
 */
fun EditText.FormatMoney(back:((String)->(Unit))?) {
    var et = this
    var input = ""
    this.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}

        override fun afterTextChanged(s: Editable) {
            var str = et.text?.toString()!!.trim()
            //用于處理多個(gè)小數(shù)點(diǎn)輸入問題
            if (!TextUtils.isEmpty(str) && str.indexOf(".") != str.lastIndexOf(".")) {
                et.setText(input)
                et.setSelection(et.text!!.length)//將光標(biāo)移至文字末尾
                return
            }
            //控制輸入時(shí)只能輸入1個(gè)0
            if (!TextUtils.isEmpty(str) && str == "00") {
                et.setText("0")
                et.setSelection(et.text!!.length)//將光標(biāo)移至文字末尾
                return
            }
            //控制輸入時(shí)第一個(gè)為0第二位不為.的情況
            if (!TextUtils.isEmpty(str) && str.length >= 2 && str.indexOf("0") == 0 && str.indexOf(".") != 1) {
                et.setText(str.substring(1, str.length))
                et.setSelection(et.text!!.length)//將光標(biāo)移至文字末尾
                return
            }
            input = str
            //用于處理限制輸入小數(shù)點(diǎn)后2位問題
            val index = et.text?.indexOf(".")
            if (index!! > 0 && index < et.text?.length!! - 3) {
                val str = et.text?.substring(0, et.text?.toString()?.trim()?.indexOf(".")!! + 3)
                et.setText(str)
                et.setSelection(et.text!!.length)//將光標(biāo)移至文字末尾
            }
            if (index == 0) {
                et.setText("0" + et.text!!)
                et.setSelection(et.text!!.length)//將光標(biāo)移至文字末尾
            }
            back?.invoke(str)
        }
    })
}

/**
 * 對(duì)輸入的內(nèi)容進(jìn)行格式化處理
 * 使輸入的數(shù)字大于0
 */
fun EditText.formatNum(back:((String?)->(Unit))?=null) {
    inputType = InputType.TYPE_CLASS_NUMBER
    var et = this
    this.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}

        override fun afterTextChanged(s: Editable) {
            var str = et.text?.toString()!!.trim()
            //控制輸入時(shí)只能輸入1個(gè)0
            if (!TextUtils.isEmpty(str)&&str.startsWith("0")&&str!="0") {
                try {
                    et.setText(str.toInt().toString())
                    et.setSelection(str.length)
                } catch (e: Exception) {
                    et.setText("1")
                }
            }
            back?.invoke(str)
        }
    })
}

/**
 * 添加鍵盤搜索監(jiān)聽
 */
fun EditText.addEditorActionListener(search: ((String?) -> (Unit))?) {
    setOnEditorActionListener { v, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            search?.invoke(text.toString())
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.hideSoftInputFromWindow(v.windowToken, 0)
        }
        false
    }
}

相關(guān)標(biāo)點(diǎn)和表情過濾如下:

package com.szhg9.magicworkep.common.utils;

import android.text.InputFilter;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.EditText;

import com.jess.arms.utils.ArmsUtils;
import com.szhg9.magicworkep.R;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EditTextUtils {
    /**
     * 禁止EditText輸入空格
     *
     * @param editText
     */
    public static void setEditTextInhibitInputSpace(EditText editText) {
        InputFilter filter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (source.equals(" ")) {
                    return "";
                } else {
                    return null;
                }
            }
        };
        editText.setFilters(new InputFilter[]{filter});
    }

    /**
     * 禁止EditText輸入特殊字符
     *
     * @param editText
     */
    public static void setEditTextInhibitInputSpeChat(EditText editText) {

        InputFilter filter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (source.equals(" ")) {
                    return "";
                } else {
                    String speChat = "[`~~!@#$%^&*()+-=|{}':;',\\[\\].<>/?~臼节!@#¥%……&*()——+|{}【】‘蓝仲;:”“’。官疲,、亮隙?]";
                    Pattern pattern = Pattern.compile(speChat);
                    Matcher matcher = pattern.matcher(source.toString());
                    if (matcher.find()) return "";
                    else return null;
                }
            }
        };
        editText.setFilters(new InputFilter[]{filter});
    }


    public static void setLengthInputFilter(EditText editText, final int maxLength){

        InputFilter filter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                int dindex = 0;
                int count = 0;

                while (count <= maxLength && dindex < dest.length()) {
                    char c = dest.charAt(dindex++);
                    if (c < 128) {
                        count = count + 1;
                    } else {
                        count = count + 2;
                    }
                }

                if (count > maxLength) {
                    return dest.subSequence(0, dindex - 1);
                }

                int sindex = 0;
                while (count <= maxLength && sindex < source.length()) {
                    char c = source.charAt(sindex++);
                    if (c < 128) {
                        count = count + 1;
                    } else {
                        count = count + 2;
                    }
                }

                if (count > maxLength) {
                    sindex--;
                }

                return source.subSequence(0, sindex);
            }
        };

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

    /**
     * 禁止EditText輸入特殊字符
     */
    public static class InhibitInputSpeChatFilter implements InputFilter{
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (source.equals(" ")) {
                return "";
            } else {
                String speChat = "[-`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~途凫!@#¥%……&*()——+|{}【】‘;:”“’溢吻。维费,、促王?]";
                Pattern pattern = Pattern.compile(speChat);
                Matcher matcher = pattern.matcher(source.toString());
                if (matcher.find()) return "";
                else return null;
            }
        }
    }

    /**
     * 限制EditText最大長(zhǎng)度 中文2個(gè)字節(jié), 英文1個(gè)字節(jié)
     */
    public static class LengthInputFilter implements InputFilter {
        private int maxLen = 0;

        public LengthInputFilter(int maxLen) {
            this.maxLen = maxLen;
        }

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            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 + 2;
                }
            }

            if (count > maxLen) {
                return "";
            }

            int sindex = 0;
            while (count <= maxLen && sindex < source.length()) {
                char c = source.charAt(sindex++);
                if (c < 128) {
                    count = count + 1;
                } else {
                    count = count + 2;
                }
            }

            if (count > maxLen) {
                sindex--;
            }

            return source.subSequence(0, sindex);
        }
    }


    public static  InputFilter getInputFilterProhibitEmoji() {
        InputFilter filter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                StringBuffer buffer = new StringBuffer();
                for (int i = start; i < end; i++) {
                    char codePoint = source.charAt(i);
                    if (!getIsEmoji(codePoint)) {
                        buffer.append(codePoint);
                    } else {
                        ArmsUtils.snackbarText("暫不支持表情輸入");
                        i++;
                        continue;
                    }
                }
                if (source instanceof Spanned) {
                    SpannableString sp = new SpannableString(buffer);
                    TextUtils.copySpansFrom((Spanned) source, start, end, null,
                            sp, 0);
                    return sp;
                } else {
                    return buffer;
                }
            }
        };
        return filter;
    }

    public static boolean getIsEmoji(char codePoint) {
        if ((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                || (codePoint == 0xD)
                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)))
            return false;
        return true;
    }

    public static InputFilter getInputFilterProhibitSP() {
        InputFilter filter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                StringBuffer buffer = new StringBuffer();
                for (int i = start; i < end; i++) {
                    char codePoint = source.charAt(i);
                    if (!getIsSp(codePoint)) {
                        buffer.append(codePoint);
                    } else {
                        ArmsUtils.snackbarText("暫不支持表情輸入");
                        i++;
                        continue;
                    }
                }
                if (source instanceof Spanned) {
                    SpannableString sp = new SpannableString(buffer);
                    TextUtils.copySpansFrom((Spanned) source, start, end, null,
                            sp, 0);
                    return sp;
                } else {
                    return buffer;
                }
            }
        };
        return filter;
    }

    public static boolean getIsSp(char codePoint){
        if(Character.getType(codePoint)>Character.LETTER_NUMBER){
            return true;
        }
        return false;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末犀盟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝇狼,更是在濱河造成了極大的恐慌阅畴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅耘,死亡現(xiàn)場(chǎng)離奇詭異贱枣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颤专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門纽哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栖秕,你說我怎么就攤上這事春塌。” “怎么了簇捍?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵只壳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我暑塑,道長(zhǎng)吕世,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任梯投,我火速辦了婚禮命辖,結(jié)果婚禮上况毅,老公的妹妹穿的比我還像新娘。我一直安慰自己尔艇,他們只是感情好尔许,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著终娃,像睡著了一般味廊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棠耕,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天余佛,我揣著相機(jī)與錄音,去河邊找鬼窍荧。 笑死辉巡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕊退。 我是一名探鬼主播郊楣,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓤荔!你這毒婦竟也來了净蚤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤输硝,失蹤者是張志新(化名)和其女友劉穎今瀑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體点把,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡放椰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愉粤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾医。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衣厘,靈堂內(nèi)的尸體忽然破棺而出如蚜,到底是詐尸還是另有隱情,我是刑警寧澤影暴,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布错邦,位于F島的核電站,受9級(jí)特大地震影響型宙,放射性物質(zhì)發(fā)生泄漏撬呢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一妆兑、第九天 我趴在偏房一處隱蔽的房頂上張望魂拦。 院中可真熱鬧毛仪,春花似錦、人聲如沸芯勘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荷愕。三九已至衡怀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間安疗,已是汗流浹背抛杨。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荐类,地道東北人怖现。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掉冶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脐雪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 今天聽說附近一位六十來歲的婦女上吊自殺了厌小,原因是犯有抑郁癥。這種病我只是在電視網(wǎng)絡(luò)上聽聞战秋,如明星璧亚、作家、主持人等脂信。...
    一顆丹心_dyg閱讀 172評(píng)論 0 2
  • 如果當(dāng)初我勇敢癣蟋,結(jié)局是不是不一樣。如果當(dāng)時(shí)你堅(jiān)持狰闪,回憶會(huì)不會(huì)不一般疯搅。最終我還是沒說,你還是忽略埋泵。這是不是最好的結(jié)局...
    蔻也閱讀 258評(píng)論 0 0
  • 有些事只要做錯(cuò)了開頭 就變得一發(fā)不可收拾
    wsno閱讀 227評(píng)論 0 0
  • 此理論適用于進(jìn)階一級(jí)的萊鳥幔欧,認(rèn)識(shí)從句。從句結(jié)構(gòu)1+(1+1)=1 由菜變?nèi)R丽声,也是需要學(xué)習(xí)滴~ 要看文章礁蔗,記得打賞喔...
    阿笨貓_6bd5閱讀 172評(píng)論 0 3
  • 作為東漢丞相浴井,曹操之奸在史上可謂赫赫有名。據(jù)《后漢書·許劭傳》記載霉撵,東漢末年著名評(píng)論家許劭曾這樣當(dāng)面評(píng)價(jià)曹操:“君...
    白乙笑談閱讀 505評(píng)論 0 1