【问题标题】:What does KeyListener do exactly?KeyListener 究竟做了什么?
【发布时间】:2011-11-09 20:11:55
【问题描述】:

如果我是对的,那么当区域设置显示小数点为逗号时(如在德国或意大利),Android 的数字键盘不接受输入逗号时存在错误。它仍然只接受点。我必须在我的应用程序中修复这个错误。要求是:

  1. 当焦点设置为 EditText 时,程序会以符号/数字模式调出软键盘。
  2. 在欧洲语言环境下,键盘接受逗号(和符号)。
  3. 而且,#2 必须以编程方式完成。

我发现我可以使用 XML 来实现 #1 和 #2(althgout 它允许在输入中使用多个符号和小数点),但它不满足 #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);

【问题讨论】:

  • 没有 Keylistener 它对我有用。编辑的 XML 文件:

标签: android keylistener


【解决方案1】:

你需要知道的关于 KeyListener 的一切都是here

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这应该可以解决问题。

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

    【讨论】:

    • 适用于默认键盘。但是三星设备的默认键盘(使用运行 4.3 的 S3 测试)在添加此侦听器后无法显示小数分隔符(也带有“1234567890.,-”)
    猜你喜欢
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    • 2019-10-06
    • 2021-01-01
    相关资源
    最近更新 更多