诡异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.

相关推荐
阿pin8 小时前
Android随笔-kotlin withContext
android·kotlin·withcontext
树码小子9 小时前
开启 IDEA 中的断言功能
android·java·intellij-idea
Kslient9 小时前
HeaderBehavior
android
Android-Flutter10 小时前
android 动画详解
android·kotlin
姚青&14 小时前
Bug基本概念
bug
小孔龙15 小时前
GraphicBuffer 跨进程共享
android
AI多Agent协作实战派16 小时前
AI多Agent协作系统实战(三十九):AI修对了Bug,却越了权——自动化团队的第一条铁律
人工智能·自动化·bug
行业研究员16 小时前
Android内置GPS与腾讯地图定位技术对比分析
android·android定位·腾讯地图定位
Android-Flutter16 小时前
android WMS 详解(二)
android·kotlin
游戏开发爱好者817 小时前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone