诡异Bug:输入框删除字符,却越删越多

最近在开发一个 Android 设备信息采集应用时,测试人员反馈了一个非常诡异的问题:在设备信息录入页面的一个文本输入框中,点击删除键非但无法删除字符,输入框内的文本反而越删越多,甚至出现重复拼接的现象。更让人头疼的是,这个问题只在英文语言环境下出现,且只在某个特定品牌的定制输入法上复现,换成系统默认输入法后一切正常。

经过排查与尝试,最终找到了根本原因并成功修复。

问题现象

  1. 用户在输入框中输入一段字符串(例如 SN2024001)。

  2. 点击删除键(Backspace),光标位置似乎正常,但文本长度非但没有减少,反而突然增长,甚至出现字符串重复。

  3. 继续点击删除键,文本持续异常增长,根本无法正常删除。

  4. 切换至系统默认输入法(如 Android 键盘 AOSP)后,删除功能恢复正常。

  5. 问题仅在英文语言环境下出现,中文环境正常;仅在某品牌定制输入法上复现,其他第三方输入法正常。

第一反应是怀疑自己的 TextWatcherRecyclerView 适配器存在 bug。反复检查代码:

  • TextWatcher.afterTextChanged() 中虽然更新了数据模型,但没有对文本进行任何二次修改。

  • 适配器中存在 notifyDataSetChanged() 调用,可能导致列表刷新时重新绑定了 EditText 内容。但即使改为 notifyItemChanged() 局部刷新,问题依旧。

  • 尝试添加编辑保护标志、焦点判断等方式,均无效。

让测试人员切换到系统默认输入法(AOSP),问题消失;

核心思路

  1. 强制禁用输入法联想 :通过 setInputType 增加 TYPE_TEXT_FLAG_NO_SUGGESTIONSTYPE_TEXT_VARIATION_VISIBLE_PASSWORD(密码类型会强制禁用联想,但字符仍正常显示)。

  2. 拦截删除键事件 :为 EditText 设置 OnKeyListener,当检测到 KEYCODE_DEL 时,手动删除最后一个字符,并返回 true 表示事件已消费。

  3. 清理可能干扰的配置 :清空 setPrivateImeOptions,防止旧配置影响。

代码实现

在列表适配器的 onBindViewHolder

java 复制代码
// 强制输入类型,禁用联想
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

// 增加密码类型标记(仅影响输入法行为,界面仍是明文)
editText.setInputType(editText.getInputType() | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

// 清空私有参数
editText.setPrivateImeOptions("");

// 应用层接管删除键
editText.setOnKeyListener((v, keyCode, event) -> {
    if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
        Editable text = ((EditText) v).getText();
        if (text != null && text.length() > 0) {
            // 删除最后一个字符
            text.delete(text.length() - 1, text.length());
        }
        return true; // 事件已处理,不再交给输入法
    }
    return false;
});

同时在布局文件中editText添加下面的设置:

XML 复制代码
android:inputType="textNoSuggestions"
android:importantForAutofill="no"
android:autofillHints=""

测试ok.

相关推荐
随遇丿而安2 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
nwsuaf_huasir2 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li2 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页2 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at2 小时前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at2 小时前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at3 小时前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at3 小时前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi89993 小时前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑