【问题标题】:Android virtual keyboard eventAndroid虚拟键盘事件
【发布时间】:2011-12-29 17:59:35
【问题描述】:

我正在尝试使用 4 个 EditText 块来实现 iPhone 之类的 PIN 码授权:

我正在使用 TextWatcher 检查字段是否已更改,以便我可以在块之间跳转。 代码如下:

@Override
public void afterTextChanged(Editable s) {
    if (del && index > 0) {
        pin[index - 1].requestFocus();
    }
    else if ( ! del && ind < 3) {
        pin[index + 1].requestFocus();
    }
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {

    del = count != 0;
}

一切正常,除了当块为空并且按下 DEL/BACKSPACE 时,我想回到前一个块并清除它的值。 这是 TextWatcher 让我失败的地方,因为在空块中没有进行任何更改,它没有做任何事情。

我尝试过使用 keyEventListener,但它只能通过虚拟键盘捕获模拟器上的事件,而不是实际设备上的事件。

谁能建议我如何捕捉 DEL 事件或任何其他方式来实现它?

【问题讨论】:

    标签: java android events keyboard


    【解决方案1】:

    也许您可以在更改前后检查该字段是否为空?不知道是否有任何其他按键可以使该字段为空,因此您可以说,按下后退并跳转到上一个字段。好吧,这不是一个真正的技术解决方案,而只是一种看待问题的不同方式。

    【讨论】:

    • 是的,我也想过。但是 TextWatcher 绑定到 onTextChange 事件,因此如果没有任何更改,它不会触发。如果有合适的事件,我仍在审查文档。感谢您的建议
    【解决方案2】:

    我找到了解决此问题的方法。这可能不是最好的解决方案,但它对我有用。 除了TextWatcher,我还在区块中添加了InputFilter

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
        if ( end == 0 && ind > 0 && dest.length() == 0 ) {
            pin[ind - 1].requestFocus();
        }
        return null;
    }
    

    我还认为将其余代码从 TextWatcher 移植到 InputFilter 是一个更好的主意

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 2017-12-17
      • 2011-01-04
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多