Android虚拟键盘事件

发布于 2024-12-16 15:58:29 字数 790 浏览 0 评论 0原文

我正在尝试使用 4 个 EditText 块来实现类似 iPhone 的 PIN 码授权,如下所示:

iphone pinauthorization

我正在使用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 事件或任何其他方式来实现这个想法吗?

I'm trying to implement iPhone like PIN-code authorization with 4 EditText blocks like this:

iphone pin authorization

I'm using TextWatcher to check if field was changed so I can jump between blocks.
Here is the code:

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

Everything works fine except when block is empty and DEL/BACKSPACE is pressed, I want to go back to previous block and clear its' value.
This is where TextWatcher fails me since no change was made in empty block it doesn't do anything.

I have tried using keyEventListener but it only catches events on emulator not on actual device via virtual keyboard.

Can anyone suggest an idea of how can I catch DEL event or any other way to implement this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无力看清 2024-12-23 15:58:29

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

Maybe you can check if the field is empty before and after change? Don't know if any other key press can leave the field empty and so you can say, back was pressed and jump to previous field. Ok this is not a real technical solution, but just a different way of viewing the problem.

装迷糊 2024-12-23 15:58:29

我找到了解决此问题的方法。这可能不是最好的解决方案,但它对我有用。
除了 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 移植到 是一个更好的主意>输入过滤器

I found a workaround for this issue. This is probably not the best solution, but it works for me.
Aside from TextWatcher I've added InputFilter to blocks

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

I also think it's a better idea to port the rest of the code from TextWatcher to InputFilter

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文