You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多EditText实现OTP输入时如何解决退格键焦点跳转异常问题

问题原因分析
  • OnKeyListener 会对按键的 ACTION_DOWN(按下) 和 ACTION_UP(抬起) 两个事件各触发一次回调,当前代码没有对事件动作做过滤,按一次退格键会连续执行两次焦点切换逻辑:第一次从et6跳到et5,第二次直接从et5跳到et4,最终表现就是直接跳转至et4。
  • 条件判断中使用的是单管道|位运算符,应该替换为双管道||逻辑或运算符,属于潜在逻辑漏洞,虽不是本次问题的直接诱因,但建议同步修复。
修复方案

修改后的代码如下:

et6.setOnKeyListener((v, keyCode, event) -> {
    // 仅处理按键按下事件,避免重复触发逻辑
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        if (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_BACK) {
            et5.requestFocus();
            // 若需要选中et5原有内容方便直接输入替换,可加下方代码
            // et5.selectAll();
            return true; // 标记事件已消费,避免系统默认处理冲突
        }
    }
    return false;
});
额外优化建议
  • 可以将6个EditText存入数组/列表,统一设置监听逻辑,通过当前焦点所在的索引计算上一个输入框的位置,不用每个输入框单独写重复代码。
  • 给每个输入框设置maxLength=1,补充输入完成后自动跳转下一个输入框的逻辑,配合退格逻辑使用体验更流畅。
  • 高版本Android部分第三方输入法的退格键不会触发OnKeyListener,如果遇到兼容问题,可以改用TextWatcher监听输入框内容变化来处理退格逻辑,兼容性更好。

内容的提问来源于stack exchange,提问作者Mihir Raval

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:07