李大cat38324 2021-08-11 09:57 采纳率: 0%
浏览 25

Edittext.requestFocus()后,使用adb shell input text丢失第一个字符

最近写一个安卓工具时,遇到这样一个奇怪的问题:

在某业务结束后,将Edittext内容清空并且默认获取焦点。因为设备是外接一个扫码的机器,那台设备会在扫码后在连接的设备获取焦点的位置输入扫码获取的值。

现在出现这样一个情况:

第一次输入正常,业务逻辑正常。当edittext清空内容并获取焦点后:

 mBinding.xtkh.setFocusable(true);
 mBinding.xtkh.setFocusableInTouchMode(true);
 mBinding.xtkh.requestFocus();
 mBinding.xtkh.setText("");

第二次扫码机录入的数据就会少第一个字符。比如扫码机应该录入的是"test",但是edittext显示的是"est"。

如果继续扫码,就会接收到正常数据,并且拼接到后面,变成"esttext"。

奇怪的是,如果第一次输入正常后,手动点击下edittext获取焦点,那第二次会正常输入。

  • 写回答

1条回答 默认 最新

  • collapser_ 2023-02-20 03:54
    关注

    这个问题可能是由于你在将 EditText 清空并获取焦点后立即扫码,此时可能导致扫码的第一个字符没有被完全捕捉到。这可能是由于焦点变化或者输入法延迟的原因导致的。

    一种解决方案是在清空 EditText 之后,延迟一段时间再开始扫码。你可以使用 Handler 来实现这个功能,如下所示:

    
    mBinding.xtkh.setFocusable(true);
    mBinding.xtkh.setFocusableInTouchMode(true);
    mBinding.xtkh.requestFocus();
    mBinding.xtkh.setText("");
    
    // 延迟 500 毫秒开始扫码
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            // 开始扫码
        }
    }, 500);
    

    这样做的效果是,清空 EditText 后等待 500 毫秒再开始扫码,这样就能保证扫码的第一个字符能够被完全捕捉到,避免出现数据丢失的情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月11日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分