KeyListener到底做了什么?

时间:2011-09-03 18:47:18

标签: android keylistener

如果我是对的,有一个错误,当语言环境表示小数点是逗号(如在德国或意大利)时,Android的数字键盘不接受输入逗号。它仍然只接受点。我必须在我的应用中修复此错误。要求是:

  1. 当焦点设置为EditText时,程序会以符号/数字模式调出软键盘。
  2. 在欧洲语言环境下,键盘接受逗号(和符号)。
  3. 并且,#2必须以编程方式完成。
  4. 我发现我可以使用XML来实现#1和#2(虽然它允许在输入中允许多个符号和小数点),但它不满足#3:

    android:inputType="numberDecimal|numberSigned"
    android:digits="1234567890,-"
    

    文档说android:digits可以使用KeyListener来实现。所以我做了一个KeyListener来允许/禁止字符。但是从我看到的情况来看,无论我从onKeyDown()返回什么,输入字符总是被允许的。我希望KeyListener()允许我过滤输入,但我一定错过了什么。你能指出来吗?谢谢!

    et.setKeyListener(new KeyListener() {
        @Override public void clearMetaKeyState(View view, Editable content, int states) {} 
        @Override public int getInputType() {  return InputType.TYPE_CLASS_NUMBER; }
        @Override public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
            if ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) ||
                keyCode == KeyEvent.KEYCODE_MINUS || 
                keyCode == KeyEvent.KEYCODE_COMMA) {
                // I want to allow these
                return false;
            }
            // I want to disallow the rest
            return true;
        }
        @Override public boolean onKeyOther(View view, Editable text, KeyEvent event) { return false; }
        @Override public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) { return false; }
    });
    

    P.S:我也尝试使用et.setFilters()并为其定制InputFilter。但似乎只要android:inputType="numberDecimal"存在,我需要将键盘设置为数字/符号模式,它会忽略我的过滤器。

    final int decimalPoint = ',';
    InputFilter[] filterArray = new InputFilter[1];  
    filterArray[0] = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
        {
            int dots = 0, i;
            String s = source.toString();
            String d = dest.toString();
            boolean hasSign = false;
    
            if (source.length() == 0)
                return null;
    
            for (i = 0; i < d.length(); i++)
                if (d.charAt(i) == '-')
                    hasSign = true;
                else if (d.charAt(i) == decimalPoint)
                    dots++;
            for (i = start; i < end && i < s.length(); i++) {
                if ((s.charAt(i) >= '0' && s.charAt(i) <= '9') ||
                    (s.charAt(i) == '-' && !hasSign && i == start && d.length() == 0))
                    continue;
                if (s.charAt(i) == decimalPoint && dots == 0) {
                    dots++;
                    continue;
                }
                s = s.substring(0, start) + s.substring(start + 1, end);
                end--;
            }
            return s.length() == source.length() ? null : s;
        }};
    et.setFilters(filterArray);
    

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题。

et.setKeyListener(DigitsKeyListener.getInstance("1234567890,-"));

答案 1 :(得分:-2)

您需要了解的关于KeyListener的所有内容都是here

希望能帮助你。