关于EditText的一些操作扩展

相关方法如下:

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
}

/**
 * 过滤标点
 */
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和标点
 */
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
}

/**
 * 对输入的金额进行格式化处理
 */
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()
            //用于处理多个小数点输入问题
            if (!TextUtils.isEmpty(str) && str.indexOf(".") != str.lastIndexOf(".")) {
                et.setText(input)
                et.setSelection(et.text!!.length)//将光标移至文字末尾
                return
            }
            //控制输入时只能输入1个0
            if (!TextUtils.isEmpty(str) && str == "00") {
                et.setText("0")
                et.setSelection(et.text!!.length)//将光标移至文字末尾
                return
            }
            //控制输入时第一个为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)//将光标移至文字末尾
                return
            }
            input = str
            //用于处理限制输入小数点后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)//将光标移至文字末尾
            }
            if (index == 0) {
                et.setText("0" + et.text!!)
                et.setSelection(et.text!!.length)//将光标移至文字末尾
            }
            back?.invoke(str)
        }
    })
}

/**
 * 对输入的内容进行格式化处理
 * 使输入的数字大于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()
            //控制输入时只能输入1个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)
        }
    })
}

/**
 * 添加键盘搜索监听
 */
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
    }
}

相关标点和表情过滤如下:

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最大长度 中文2个字节, 英文1个字节
     */
    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;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 今天听说附近一位六十来岁的妇女上吊自杀了,原因是犯有抑郁症。这种病我只是在电视网络上听闻,如明星、作家、主持人等。...
    一颗丹心_dyg阅读 172评论 0 2
  • 如果当初我勇敢,结局是不是不一样。如果当时你坚持,回忆会不会不一般。最终我还是没说,你还是忽略。这是不是最好的结局...
    蔻也阅读 256评论 0 0
  • 有些事只要做错了开头 就变得一发不可收拾
    wsno阅读 227评论 0 0
  • 此理论适用于进阶一级的莱鸟,认识从句。从句结构1+(1+1)=1 由菜变莱,也是需要学习滴~ 要看文章,记得打赏喔...
    阿笨猫_6bd5阅读 172评论 0 3
  • 作为东汉丞相,曹操之奸在史上可谓赫赫有名。据《后汉书·许劭传》记载,东汉末年著名评论家许劭曾这样当面评价曹操:“君...
    白乙笑谈阅读 503评论 0 1