EditText 利用IntentFilter 限制输入 0-9 a-z A-Z
2017-01-12 10:52
260 查看
好记性不如烂笔头
EditText 限制输入内容为 0-9 a-z A-Z 的搬运总结,方法一 二 三 都是有缺陷的 方法四 目前为止能解决问题
方法一
这个是最常见的,大部分情况都能正常使用,但是有一个问题(自带英文输入法容易复现) 就是前面正常输入 例如"he" 然后紧跟一个非法字符 例如"-" 这时发现EditText 会变为空,原来的合法输入"he"也消失了
方法二
方法三
方法四
This is the only answer that actually has the right approach to prevent repeating text from dictionary suggestions! Upvote!
备注:1-3的方法问题复现需要一定的条件,例如手机系统,android版本,输入法之类的.我在自己的华为p9上使用时还是没有问题的
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上使用时还是没有问题的
相关文章推荐
- InputFilter实现EditText文本输入过滤器
- android EditText限制输入长度
- Android中限制EditText(输入框)文字输入长度
- EditText限制用户的输入 inputType
- android 小技巧3-edittext做输入限制
- Android中EditText的输入字数限制
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
- android edittext 输入长度限制并提示
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
- 限制EDITTEXT可输入的字符个数
- Android 动态限制EditText输入的字条类型及键盘类型、对输入的监控
- android中editText 输入字数限制
- Android:EditText限制文字输入
- [转]Android:EditText限制文字输入
- Android:EditText限制文字输入
- android控件EditText限制指定字符输入
- EditText输入限制setFilters
- Android:限制EditText中只可以输入字母和数字
- android editText 输入字数限制
- android 中如何限制 EditText 最大输入字符数(2)