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

CodenameOne Android端TextField焦点异常问题求助

问题解决:Android扫描器TextField焦点异常修复

问题核心

在Unitech HT730设备上,扫描条码后Barcode TextField清空并请求焦点后,光标虽显示但无法接收扫描输入,需触摸后才恢复正常;移除clear()则问题缓解但无法清空输入框。

原因分析

  • 直接调用sleep()会阻塞UI线程,导致焦点状态和UI渲染不同步
  • clear()后光标位置未重置到起始位,Android系统判定输入框处于异常焦点状态
  • 事件处理逻辑中,DataChange事件被重复触发(清空操作也会触发),干扰焦点请求

修复方案

  1. 移除所有阻塞UI线程的sleep()和冗余repaint():UI操作必须在UI线程异步执行,避免阻塞导致状态混乱
  2. 清空后手动重置光标位置:确保光标回到输入框起始处
  3. 用UI线程调度执行焦点请求:保证焦点操作在UI渲染完成后执行
  4. 优化事件触发判断:避免清空操作触发的DataChange事件干扰正常流程

修改后的代码示例

gui_Barcode_t.addDataChangeListener((i1, i2) -> {           
    String s1 = gui_Barcode_t.getText();
    
    // 仅处理非空的有效扫描输入(过滤清空操作触发的事件)
    if (s1.length() == 0) {
        return;
    }           
    
    // 将条码添加到列表
    List_s += s1 + "\n";
    gui_BarcodeList_ta.setText(List_s);

    // 在UI线程异步执行清空和焦点请求,确保顺序执行
    // 若为Codename One用callSerially,Android原生用runOnUiThread
    callSerially(() -> {
        // 清空输入框并重置光标位置
        gui_Barcode_t.clear();
        gui_Barcode_t.setCursorPosition(0);
        
        // 请求焦点
        gui_Barcode_t.requestFocus();
    });
});

额外优化建议

  • 启动时设置焦点:在界面初始化完成后,同样通过UI线程调度执行gui_Barcode_t.requestFocus(),避免启动时焦点设置失效
  • 避免字符串拼接:使用StringBuilder代替List_s += ...,提升大量扫描时的性能

内容的提问来源于stack exchange,提问作者Doug Sisco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:10:34