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

时间:2011-09-07 14:19:15

标签: android android-edittext keypad

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

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

9 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:20)

尝试将digits参数添加到editText:

android:digits="abcde.....012345789"

答案 2 :(得分:3)

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

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "

答案 3 :(得分:2)

尝试使用这种方法对我有用:

### "manual" palette with transparency
reset session

# These are the rgb formulae behind palette 22,13,-22
set angle degrees
r(x) = 3*x-1 < 0 ? 0: (3*x-1 > 1) ? 1 : 3*x-1
g(x) = sin(180*x)
b(x) = 1-(3*x-1) < 0 ? 0: (1-(3*x-1) > 1) ? 1 : 1-(3*x-1)

set xrange [0:1]
set yrange[-0.1:1.1]

RandomSize(n) = rand(0)*4+2              # random size from 2 to 6
RandomTransp(n) = int(rand(0)*0xff)<<24  # random transparency from 0x00 to 0xff
myColor(x) = (int(r(x)*0xff)<<16) + (int(g(x)*0xff)<<8) + int(b(x)*0xff) + RandomTransp(0)

set samples 200
plot '+' u (x=rand(0)):(rand(0)):(RandomSize(0)):(myColor(x)) w p pt 7 ps var lc rgb var not

### end of code

为此行添加您的编辑文字

public static InputFilter[] getFilter(String blockChars) {
   return new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
        for (int i = start; i < end; i++) {
            if (source != null && blockChars.contains("" + source.charAt(i))) {
                return source.subSequence(start, i);
            }
        }
        return null;
    }};

答案 4 :(得分:1)

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

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

EditText字段会将整个InputFilter句子传递给过滤器,返回值将为&#34;&#34;这意味着我们也会抛弃有效的 olala

这是我的解决方案:

olala[

我们需要双循环来避免每个带有效字符的方法调用的StringBuilder内存分配。

答案 5 :(得分:1)

科特琳

et_search.keyListener = DigitsKeyListener.getInstance(getString(R.string.alphanumeric))

String.xml

<string name="alphanumeric">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</string>

答案 6 :(得分:0)

  //大兄弟,这么做就可以了。 
  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 (isChineseChar(source.charAt(i))) {
                    return "";
                }
            }
            return null;
        }
    };
    etName.setFilters(new InputFilter[]{filter});

//一条简单的规则。
private static boolean isChineseChar(char c) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
    return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS;
}

答案 7 :(得分:0)

预期的解决方案是限制用户从键盘输入特殊字符。

以下解决方案使用RegX,但将其添加到strings.xml文件中,以便在创建多语言xmls时小心。

<强>的strings.xml

<string name="alpha_numeric_regx">[a-zA-Z 0-9]+</string>

源文件

 //Extracting forehand to avoid multiple calls to getString from Filter
        String alphaNumericRegX = getString(R.string.alpha_numeric_regx);
        mEditTextOtp.setFilters(new InputFilter[]{(source, start, end, dest, dStart, dEnd) -> {
            for (int i = 0; i < source.length(); i++) {
                if (source.equals("")) {
                    return source;
                }
                if (source.toString().matches(alphaNumericRegX)) {
                    return source;
                }
                return "";
            }
            return null;
        }});

希望这能解决问题。对于新人。 :)

答案 8 :(得分:-1)

正在运作 限制Edittext中的特殊符号

    private EditText your_editText ;
    private String blockCharacters = "(~*#^|$%&!";

    private InputFilter filter = new InputFilter() {

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            if (source != null && blockCharacters.contains(("" + source))) {
                return "";
            }
            return null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        your_editText = (EditText) findViewById(R.id.your_editText);
        your_editText .setFilters(new InputFilter[] { filter });
    }

}