EditText 输入限制

来源:互联网 发布:国外js特效网站 开源 编辑:程序博客网 时间:2024/06/04 18:31

最近项目,遇到一个需求输入姓名只能是韩文(棒子的app),不能有任何的数字,特殊符号,英文字母。。。

本来以为很简单 查询一下韩文Unicode 范围”\uAC00-\uD7A3”

然后想当然的写一个正则
"^[\uAC00-\uD7A3]+$"

然后写一个Edittext 继承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 mInputConnecttion(super.onCreateInputConnection(outAttrs),                false);    }}class mInputConnecttion extends InputConnectionWrapper implements InputConnection {    public mInputConnecttion(InputConnection target, boolean mutable) {        super(target, mutable);    }    /**     * 对输入的内容进行拦截     *     * @param text     * @param newCursorPosition     * @return     */    @Override    public boolean commitText(CharSequence text, int newCursorPosition) {        // 只能输入汉字        if (!text.toString().matches("^[\uAC00-\uD7A3]+$") || text.toString().matches("^[0-9]*$")) {            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);    }}

以为这样就ok了
测试还可以,但是用了一下go输入法 输入一切比较正常
但是如果在英文时候切换阿拉伯数字输入,就能把数字输入到edittext里
debug 发现在英文切数字之后 输入数字根本进入

 @Override    public boolean commitText(CharSequence text, int newCursorPosition) {        // 只能输入汉字        if (!text.toString().matches("^[\uAC00-\uD7A3]+$") || text.toString().matches("^[0-9]*$")) {            return false;        }        return super.commitText(text, newCursorPosition);    }

这段方法

无解~~换方式

直接用原生的editText 设置一个Filters

userNameTxt.setFilters(new InputFilter[]{                    new InputFilter() {                        @Override                        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {                            String regex = "^[\uAC00-\uD7A3]+$";                            boolean isKr = Pattern.matches(regex, source.toString());                            if (!isKr) {                                return "";                            }                            return null;                        }                    }            });

这样 测试通过 可以过滤所有规则以外的。

如有不对的地方,欢迎大神指正。
完结 撒花~~

原创粉丝点击