如何从Android键盘中为EditText排除特殊字符

Jes*_*Jes 18 android keypad android-edittext

嗨,我想在Android的EditText键盘上只显示数字和字符,我确实尝试添加属性,android:inputType = text|number但它不起作用.

请帮助我提出任何其他更好的建议.提前致谢.

Aju*_*Aju 32

使用过滤器.这里我要添加过滤器代码.

EditText etName = (EditText)findViewById(R.id.etName);
InputFilter filter = new InputFilter() { 
            @Override
            public CharSequence filter(CharSequence source, int start, int end, 
                            Spanned dest, int dstart, int dend) { 
                    for (int i = start; i < end; i++) { 
                            if (!Character.isLetterOrDigit(source.charAt(i))) { 
                                    return ""; 
                            } 
                    } 
                    return null; 
            }
};
etName.setFilters(new InputFilter[]{filter}); 
Run Code Online (Sandbox Code Playgroud)

  • 太好了,这正是我所需要的。即使不是全部字符集,也应能跨大多数字符集工作。 (2认同)

Dyo*_*sos 21

尝试将digits参数添加到editText:

android:digits="abcde.....012345789"
Run Code Online (Sandbox Code Playgroud)

  • 当然这对于多语言应用来说一定是个噩梦吗? (10认同)

Nor*_*ain 6

此处提供的解决方案InputFilter并非 100% 正确,因为如果输入中的一些有效字符位于无效字符旁边,它将替换并丢弃这些字符。

例如我们需要过滤掉所有特殊字符,您输入文本:olala[

EditText 字段会将整个olala[句子传递给过滤器,返回值将为“”,这意味着我们也丢弃了有效的olala 。

这是我的解决方案:

InputFilter filter = (source, start, end, dest, dstart, dend)->{
    for (int i = start; i < end; i++) {
        char symbol = source.charAt(i);
        if (!isValidCharacter(symbol)) {
            StringBuilder buf = new StringBuilder();
            for(int j = start; j < end; j++)
            {
                symbol = source.charAt(j);
                if(isValidCharacter(symbol)) buf.append(symbol);
            }
            return buf.toString();
        }
    }
    return null;
};
Run Code Online (Sandbox Code Playgroud)

这里我们需要双循环,以避免为每个具有有效字符的方法调用分配 StringBuilder 的内存。


Thi*_*dav 5

如果要添加空格,可以在最后一位数字后留出空格。

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