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

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

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

问题现象

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

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

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

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

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

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

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

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

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

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

核心思路

  1. 强制禁用输入法联想 :通过 setInputType 增加 TYPE_TEXT_FLAG_NO_SUGGESTIONS 和 TYPE_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.

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone4 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui