EditText 利用IntentFilter 限制输入 0-9 a-z A-Z

好记性不如烂笔头

EditText 限制输入内容为 0-9 a-z A-Z 的搬运总结,方法一 二 三 都是有缺陷的    方法四 目前为止能解决问题

方法一

 InputFilter filter1 = new InputFilter() {
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                for (int i = start; i < end; i++) {
                    if (!Character.isLetterOrDigit(source.charAt(i))) {
                        return "";
                    }
                }
                return null;
            }
        };
        etOne.setFilters(new InputFilter[]{filter1});

这个是最常见的,大部分情况都能正常使用, 但是有一个问题(自带英文输入法容易复现) 就是前面正常输入 例如"he" 然后紧跟一个非法字符 例如"-" 这时发现EditText 会变为空,原来的合法输入"he"也消失了


方法二

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

                if (source instanceof SpannableStringBuilder) {
                    SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder) source;
                    for (int i = end - 1; i >= start; i--) {
                        char currentChar = source.charAt(i);
                        if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) {
                            sourceAsSpannableBuilder.delete(i, i + 1);
                        }
                    }
                    return source;
                } else {
                    StringBuilder filteredStringBuilder = new StringBuilder();
                    for (int i = start; i < end; i++) {
                        char currentChar = source.charAt(i);
                        if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) {
                            filteredStringBuilder.append(currentChar);
                        }
                    }
                    return filteredStringBuilder.toString();
                }
            }
        };
        etTwo.setFilters(new InputFilter[]{filter2});
方法二在英语环境下表现很好,但输入内容如果不符合字典或者正常与非法字符串联会造成重复,例如输入"chiru" 在google原生系统 或者是用android自带英文输入法就会变成"chichi"

方法三

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        android:inputType="text" />
这个方法的问题也是在google原生系统时容易出现,例如输入"qq"紧接着输入非法字符"--"会造成"qqqq"的结果


方法四

 InputFilter filter3 = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                boolean keepOriginal = true;
                StringBuilder sb = new StringBuilder(end - start);
                for (int i = start; i < end; i++) {
                    char c = source.charAt(i);
                    if (isCharAllowed(c)) // put your condition here
                        sb.append(c);
                    else
                        keepOriginal = false;
                }
                if (keepOriginal)
                    return null;
                else {
                    if (source instanceof Spanned) {
                        SpannableString sp = new SpannableString(sb);
                        TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
                        return sp;
                    } else {
                        return sb;
                    }
                }
            }

            private boolean isCharAllowed(char c) {
                return Character.isLetterOrDigit(c);
            }
        };
        etThree.setFilters(new InputFilter[] { filter3 });
这个方法我在原生系统里面测试,一直没有遇到问题,也是stackoverflow上没有追问的,

This is the only answer that actually has the right approach to prevent repeating text from dictionary suggestions! Upvote!


备注:1-3的方法问题复现需要一定的条件,例如手机系统,android版本,输入法之类的.我在自己的华为p9上使用时还是没有问题的 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值