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


71

如何限制anEditText只接受字母数字字符,而小写字母和大写字母在EditText?中都显示为大写?

<EditText
    android:id="@+id/userInput"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="textMultiLine"
    android:minLines="3" >

    <requestFocus />
</EditText>

如果用户键入小写字母“ abcd”,则EditText应当自动显示大写字母“ ABCD”,而不必将键盘限制为大写字母。


editText.setKeyListener(DigitsKeyListener.getInstance(“ abcdefghijklmnopqrstuvwxyz1234567890”));;
AndroidGeek

Answers:


133

在XML中,添加以下内容:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

6
在这种情况下,如果我输入其他字符,则会自动输入多个字符
hitesh141

有什么办法可以限制用户仅输入字母或仅输入单个空格。
拉维·邦达里

1
@Ravi只是删除数字?在最后一个空格处留出单个空间
user2968401 2015年

这不允许OP要求的大写字符。
史蒂芬·拜尔

5
该解决方案加上textAllCaps="true"该做的事
美浓

29

如何限制EditText仅接受字母数字字符,以便无论用户键入的是小写还是大写键,EditText都将显示为大写

InputFilter解决方案效果很好,可以让您完全控制,以过滤出比更好的颗粒度的输入android:digits。如果所有字符均有效,则该filter()方法应返回;如果某些字符无效,则仅返回null有效字符中的a 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,必须确保不要覆盖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);

2
这应该是公认的答案。我已经在本页面和其他页面上尝试了建议的解决方案,并且只有该解决方案可以完美地覆盖我的所有设备(三星是特别令人讨厌的设备)。有些人只给我输入数字,有些人没能输入任何抱怨输入0字符的初始长度等信息。我也将设置过滤器简写为editText.setFilters(new InputFilter[]{new InputFilter.AllCaps(), alphanumericFilter});
ZooS

@ZooS您的速记将覆盖上InputFilters已经存在的任何内容EditText。请阅读我在代码块上方的解释,出于非常特殊的原因,以这种方式设置了过滤器。
史蒂芬·拜尔

我的意思是,您没有完全阅读说明,您是正确的。我认为这是最好的解决方案。
ZooS

1
当您连续键入两个数字时,就会发生该错误
Felipe Ribeiro R. Magalhaes

1
@GoranHoriaMihail如果您有多个非互斥的过滤器,即长度过滤器为10和一个字母数字过滤器,则需要先应用字母数字过滤器,然后再应用长度为10的过滤器。否则,如果首先应用长度过滤器,则会将其修剪为10,然后在应用字母数字过滤器时可能会删除更多非字母数字字符,而错误地仅将字母数字过滤器应用于前10个字符(而不是最多保留10个字母数字字符)。当用户从例如PW管理器将文本粘贴到EditText中时,这将起作用。
史蒂文·拜尔

14

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

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


1
对于多语言应用程序,这将失败。
MobileEvangelist

10

用这个:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"

我尝试使用textAllCaps="true"对此问题的已接受答案的注释中的建议,但未按预期工作。


对于多语言应用程序,这将失败。
MobileEvangelist

7

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"

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


1
省时间!非常感谢。
卡兰·塔卡

无法正常工作。输入无效(特殊)字符后,它将发生故障。
萨拉曼·哈立德

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 "";
                    }
                }
        });
    }

3

极简主义的Kotlin方法:

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

这导致了一个怪异的错误,其中键入内容后,edittext充满了无法删除的随机字母
Aba

1

为此,您需要创建自定义过滤器,然后将其设置为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文件中设置其他参数。


我已根据某些条件将此方法用于最后一个字符资本。谢谢。
Gunavant Patel


1

以编程方式,执行以下操作:

mEditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
mEditText.setFilters(new InputFilter[] {
    new InputFilter() {   
        @Override  
        public CharSequence filter(CharSequence input, int start, int end, Spanned dst, int dstart, int dend) { 
            if (input.length() > 0 && !Character.isLetterOrDigit(input.charAt(0))) {  
                // if not alphanumeric, disregard the latest input
                // by returning an empty string 
                return ""; 
            }
            return null;
        }  
    }, new InputFilter.AllCaps()
});

请注意, setInputType有必要以便我们确定input变量始终是用户指定的最后一个字符。

我已经尝试过在本文中讨论的其他解决方案。但是在某些情况下(例如您(Tap space bar twice for period followed by space)启用了“ Quick Period”设置),其中的许多操作都有些奇怪。使用此设置,它将从您的输入文本中删除一个字符。这段代码也解决了这个问题。


1
<EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="PromoCode"
                    android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
                    android:inputType="text" />

-1
private static final int MAX_LENGTH =13;

et_ScanLotBrCode.setFilters(new InputFilter[]{new InputFilter.AllCaps(),new InputFilter.LengthFilter(MAX_LENGTH) });

将以上代码添加到活动或片段中,使用该代码可以管理输入的长度和大写字母。


2
问题不要求限制长度。它询问如何将限制EditText为仅接受字母数字字符并以大写形式显示它们。
Puspam

-2

一线答案

XML添加此文本AllCaps =“ true”

这样做onCreate()

适用于小写和大写,并留有空间

yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));

小写并留有空间 (此问题的必需答案)

yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));

用于大写字母,并留有空间

yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));

这不允许OP要求使用小写字母或数字。
史蒂文·拜尔

@StevenByle Thanku,谢谢。我已经编辑了答案
Tushar Narang 2015年

此外,PL会再次读取问题:“如果用户键入小写字母“ abcd”,则EditText应该自动显示大写字母“ ABCD”,而不必将键盘限制为大写字母。
Tushar Narang 2015年

5
它只允许数字
Rahul Devanavar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.