如何限制EditText只接受字母数字字符
如何限制EditText
仅接受字母数字字符,在EditText
写字母和大写字符都显示为大写字母?
<EditText android:id="@+id/userInput" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textMultiLine" android:minLines="3" > <requestFocus /> </EditText>
如果用户input小写字母“abcd”, EditText
应该自动显示大写“ABCD”而不需要将键盘限制为大写。
在XML中,添加这个:
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
如何限制EditText仅接受字母数字字符,以便用户键入的任何小写或大写键,EditText将显示大写
InputFilter
解决scheme运行良好,并且可以完全控制在比android:digits
更精细的颗粒级别过滤input。 如果所有字符都是有效的,那么filter()
方法应该返回null
,或者如果某些字符无效,那么filter()
方法应该只返回有效字符的CharSequence
。 如果复制粘贴多个字符,有些字符无效,则只保留有效字符。
public static class AlphaNumericInputFilter implements InputFilter { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // Only keep characters that are alphanumeric StringBuilder builder = new StringBuilder(); for (int i = start; i < end; i++) { char c = source.charAt(i); if (Character.isLetterOrDigit(c)) { builder.append(c); } } // If all characters are valid, return null, otherwise only return the filtered characters boolean allCharactersValid = (builder.length() == end - start); return allCharactersValid ? null : builder.toString(); } }
另外,当设置你的InputFilter
,你必须确保不要覆盖EditText
上设置的其他InputFilters
; 这些可以设置为XML,如android:maxLength
。 您还必须考虑InputFilters
的设置顺序,它们按照该顺序应用。 幸运的是, InputFilter.AllCaps
已经存在,所以应用我们的字母数字filter将保留所有的字母数字文本,并将其转换为大写。
// Apply the filters to control the input (alphanumeric) ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters())); curInputFilters.add(0, new AlphaNumericInputFilter()); curInputFilters.add(1, new InputFilter.AllCaps()); InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]); editText.setFilters(newInputFilters);
用这个:
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" android:inputType="textCapCharacters"
我尝试使用textAllCaps="true"
build议在这个问题的接受答案的评论,但它没有按预期工作。
如果你不需要太多的定制,一个简单的诀窍实际上就是上面那个你想在android:digits中添加的所有字符
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
这应该工作接受带有大写字母和小写字母的数字值。
尝试这个:
private void addFilterToUserName() { sign_up_display_name_et.setFilters(new InputFilter[] { new InputFilter() { public CharSequence filter(CharSequence src, int start, int end, Spanned dst, int dstart, int dend) { if(src.equals("")){ // for backspace return src; } if(src.toString().matches("[a-zA-Z 0-9]+")){ return src; } return ""; } } }); }
这适用于我:
android:inputType="textVisiblePassword"
您不想为此编写任何正则expression式,只需将XML属性添加到“编辑”文本即可
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" android:inputType="textCapCharacters"
testing完美的PAN卡validation。
为此,您需要创build自定义filter,并像这样设置为您的EditText。
这将自动将您的字母转换为大写。
EditText editText = (EditText)findViewById(R.id.userInput); InputFilter myFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { try { Character c = source.charAt(0); if (Character.isLetter(c) || Character.isDigit(c)) { return "" + Character.toUpperCase(c); } else { return ""; } } catch (Exception e) { } return null; } }; editText.setFilters(new InputFilter[] { myFilter });
没有额外的参数设置在XML文件。
一行答案
做这个创造
用于小写字母和大写字母,允许空间
yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));
为允许空间的小写
yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));
对于允许空间的大写 (这个问题的必填答案)
yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));