KeyListener是做什么的?

4
如果我没错的话,当语言环境中规定小数点使用逗号(如德国或意大利)时,Android的数字键盘不接受输入逗号,仍然只能接受点。我必须在我的应用程序中修复此漏洞。要求如下:
  1. 将焦点设置为EditText时,程序会在符号/数字模式下弹出软键盘。
  2. 在欧洲语言环境下,键盘接受逗号(和符号)。
  3. 并且,#2必须以编程方式完成。
我发现可以使用XML来实现#1和#2(尽管它允许在输入中使用多个符号和小数点),但它无法满足#3的要求。
android:inputType="numberDecimal|numberSigned"
android:digits="1234567890,-"

文档说可以通过使用 KeyListener 来实现 android:digits 功能。因此,我编写了一个 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);

没有 Keylistener 对我来说可以工作。编辑的 XML 文件如下:<EditText android:digits="1234567890,.-" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText1" android:inputType="numberDecimal|numberSigned"> <requestFocus></requestFocus> </EditText> - Basic Coder
2个回答

1
这应该能解决问题。
et.setKeyListener(DigitsKeyListener.getInstance("1234567890,-"));

4
可以在默认键盘上工作。但三星设备(已测试使用运行4.3的S3)的默认键盘,在添加此监听器后未能显示小数分隔符(包括"1234567890.,-")。 - Zarokka

-2

关于KeyListener的一切你需要知道的都在这里

希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接