如何限制EditText只接受字母数字字符

use*_*001 61 validation android android-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>
Run Code Online (Sandbox Code Playgroud)

如果用户键入小写的"abcd",EditText则应自动显示大写"ABCD"而无需将键盘限制为大写.

Has*_*ikh 119

在XML中,添加以下内容:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案加上`textAllCaps ="true"`应该做的事情 (5认同)
  • 在这种情况下,如果我输入任何其他,这将自动输入多个字符 (4认同)

Ste*_*yle 24

如何限制EditText只接受字母数字字符,以便用户输入的小写或大写键,EditText将显示大写

InputFilter解决方案效果很好,并且可以完全控制以比更精细的粒度过滤掉输入android:digits.如果所有字符都有效,则该filter()方法应返回; 如果某些字符无效null,则该方法应返回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();
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,在设置时InputFilter,您必须确保不要覆盖InputFilters您的其他设置EditText; 这些可以用XML设置,比如android:maxLength.您还必须考虑设置的顺序InputFilters,它们按该顺序应用.幸运的是,InputFilter.AllCaps已经存在,因此使用我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写.

    // 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);
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。我已经在这个页面和其他页面上尝试了建议的解决方案,只有这个解决方案完美地覆盖了我所有的设备(三星是一个特别烦人的设备)。有些只给了我数字输入,有些只是没有输入任何抱怨输入的 0 个字符的初始长度等。我还将设置过滤器简写为 `editText.setFilters(new InputFilter[]{new InputFilter.AllCaps(),字母数字过滤器});` (2认同)

Aje*_*ngh 13

如果你不想要太多的自定义,一个简单的技巧实际上来自上面的一个,你要在android:digits中添加所有字符

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Run Code Online (Sandbox Code Playgroud)

这应该可以接受带有大写字母和小写字母的字母数字值.

  • 这对于多语言应用程序来说会失败。 (2认同)

the*_*nuj 8

用这个:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"
Run Code Online (Sandbox Code Playgroud)

我尝试textAllCaps="true"按照对此问题的已接受答案的评论中的建议使用,但它没有按预期工作.


Gal*_*Rom 6

尝试这个:

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 "";
                    }
                }
        });
    }
Run Code Online (Sandbox Code Playgroud)


Sai*_*i N 6

您不想为此编写任何正则表达式,只需将XML属性添加到“编辑”文本中

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"
Run Code Online (Sandbox Code Playgroud)

经过测试,可以完美地用于PAN卡验证。


met*_*ure 6

极简 Kotlin 方法:

fun EditText.allowOnlyAlphaNumericCharacters() {
    filters = filters.plus(
        listOf(
            InputFilter { s, _, _, _, _, _->
                s.replace(Regex("[^A-Za-z0-9]"), "")
            },
            InputFilter.AllCaps()
        )
    )
}
Run Code Online (Sandbox Code Playgroud)