如何限制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 "));