如何限制EditText仅接受字母和数字字符

14 浏览
0 Comments

如何限制EditText仅接受字母和数字字符

如何限制EditText只接受大小写字母数字字符,并且在EditText中显示为大写字母?


    

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

0
0 Comments

问题原因:通过设置android:digits属性,可以限制EditText只接受指定的字符,但这种方法无法处理多语言应用。

解决方法:使用正则表达式来限制EditText只接受字母和数字的输入。

代码示例:

EditText editText = findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        String input = charSequence.toString();
        if (!input.matches("[a-zA-Z0-9]+")) {
            editText.setText("");
        }
    }
    @Override
    public void afterTextChanged(Editable editable) {
    }
});

以上代码会监听EditText的文本变化,如果输入的内容不符合正则表达式[a-zA-Z0-9]+,则清空EditText的内容。这样就可以限制EditText只接受字母和数字的输入。

0
0 Comments

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

问题的原因是:需要限制EditText仅接受字母和数字字符,并将所有字符转换为大写字母。

解决方法如下:

1. 创建一个实现了InputFilter接口的内部类AlphaNumericInputFilter,用于过滤输入的字符。在该类的filter()方法中,只保留字母和数字字符,将其他字符过滤掉,并返回有效的字符序列。


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

2. 设置InputFilter到EditText中,但要确保不会覆盖已经设置的其他InputFilter,例如通过android:maxLength属性设置的InputFilter。同时,还要注意InputFilter的设置顺序,它们会按照设置的顺序依次应用。


// 应用过滤器控制输入(字母数字)
ArrayList curInputFilters = new ArrayList(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);

这样就可以限制EditText只接受字母和数字字符,并将所有字符转换为大写字母。

这个解决方案被认为是最佳答案,它可以在各种设备上正常运行,并且可以处理一些特殊情况,比如三星手机上的输入问题。

需要注意的是,这个解决方案也接受其他语言的字符,并且不接受空格字符。如果需要接受空格字符,可以在过滤字符时添加对空格字符的判断。

此外,有用户提到需要限制输入数学符号"π",可以通过此方法进行限制。

还有一个用户提供了一个类似的Kotlin版本的解决方案。

最后,解决方案中强调了InputFilters的设置顺序的重要性。如果有多个非互斥的过滤器,例如长度限制和字母数字过滤器,应该先应用字母数字过滤器,再应用长度限制过滤器,以确保正确的过滤结果。这在用户从密码管理器粘贴文本时会起作用。

0
0 Comments

问题出现的原因是用户希望限制EditText只能接受字母和数字字符,但是当前的设置无法满足要求。解决方法是在XML中添加android:digits属性,并指定允许的字符范围,如英文字母和数字。然而,这种方法不允许大写字母,所以可以将textAllCaps属性设置为true来解决这个问题。如果需要通过编程方式实现这个限制,可以参考stackoverflow链接提供的解决方案。需要注意的是,某些手机(如三星J系列)的键盘可能不提供空格键,因此在使用这种方法时需要测试兼容性。另外,有人指出android:digits会影响imeOptions的功能,特别是actionDone选项。对于可扩展性要求较高的情况,可以参考提供的stackoverflow链接中的另一个答案。

0