当前位置: 首页 > 知识库问答 >
问题:

当条形码扫描器读取条形码时,EditText焦点消失

贡俊
2023-03-14

我需要阅读申请的条形码。我正在使用触发器条形码扫描仪。通讯是通过USB。

如你所知,条形码扫描仪的工作方式就像键盘一样。当设备读取条形码时,它试图将该值写入具有焦点的输入。用户按下触发器,条形码扫描器工作,直到条形码读取成功。然后它就会进入待机模式。理想的方式读取大量条形码。

android:windowSoftInputMode="stateAlwaysVisible"
android:focusable="true"
android:focusableInTouchMode="true"

在xml端添加了上面的行。

 edtBarcode.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (!hasFocus)
            {
                //find the view that has focus and clear it.
                View current = getCurrentFocus();
                if (current != null)
                {
                   current.clearFocus();
                } 

                edtBarcode.requestFocus();
            }
        }
    });

它检测EditText何时失去焦点。但我不能把它分配回来。我确保EditText在触摸模式下是可聚焦的。

我是怎么解决的?

    handlerFocus = new Handler();
    final int delay = 1000; //milliseconds

    handlerFocus.postDelayed(new Runnable()
    {
        public void run()
        {
            edtBarcode.requestFocus();
            handlerFocus.postDelayed(this, delay);
        }
    }, delay);

我知道这个解决方案不好。那么如何使焦点在不打开键盘的情况下始终停留在同一个EditText中呢?

关键编辑

4年后,我意识到上面的做法是完全错误的。更好的方法在这里,我不删除旧的,因为它可以为其他人工作。

    String barcode = "";

    @Override
    public boolean dispatchKeyEvent(KeyEvent e)
    {
        if (e.getAction() == KeyEvent.ACTION_DOWN)
        {
            char pressedKey = (char) e.getUnicodeChar();
            barcode += pressedKey;
        }
        if (e.getAction() == KeyEvent.ACTION_UP && e.getKeyCode() == KeyEvent.KEYCODE_ENTER)
        {
            handleInput(barcode);
            barcode = "";
        }

        return false;
    }

共有1个答案

糜帅
2023-03-14

基本上,当用户按下触发器时,它会在您的edittext上触发keyevent。根据扫描仪的配置,可以是keycode_tabkeycode_enter

因此,我所做的是监听onkeyevent而不是onfocuschange

试试这个:

edtBarcode.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER)
                    || keyCode == KeyEvent.KEYCODE_TAB) {
                // handleInputScan();
                new Handler().postDelayed(new Runnable() {
                      @Override
                      public void run() {
                          if (edtBarcode != null) {
                               edtBarcode.requestFocus();
                          }
                      }
                }, 10); // Remove this Delay Handler IF requestFocus(); works just fine without delay
                return true;
            }
            return false;
        }
    });

希望这对你有帮助~

 类似资料:
  • 使用ML Kit的条码扫描API,您可以读取大多数使用标准条码格式编码的数据。 条形码是将信息从现实世界传递到应用程序的一种便捷方式。特别是,使用QR码等二维格式时,您可以编码结构化数据,如联系人信息或WiFi网络凭证。由于ML Kit可以自动识别和解析这些数据,因此当用户扫描条形码时,您的应用可以进行智能响应。 iOS Android 关键功能 阅读大多数标准格式 线性格式:Codabar,Co

  • 我有一个物理条形码扫描仪插入我的设备,我试图使用它扫描条形码太小,相机无法聚焦。 在我的活动中,这些是我用来检查按键的2个函数,因为我假设它是作为硬件键盘处理的。 什么能让它通过? 提前致谢

  • 所以,我正在尝试使用我的条形码扫描器作为一个‘串行’设备,而不是一个键盘模拟器,但它没有创建com端口。我已经从手册上扫描了设置代码,将其设置为串行设备,这似乎正确配置了扫描仪(它停止将扫描代码发送到文本框\文本编辑器),但因为没有COM端口,所以我扫描条形码时无法捕获数据...... Windows在第一次插入时安装了驱动程序,但没有提供磁盘\驱动程序...不知道还有没有人经历过同样的问题...

  • 我试图启动条形码扫描器上的用户按下一个按钮在HTML。然而,我又犯了一个错误: 在javascript中使用: 现在,在Java文件中,我有以下代码,它在中声明函数

  • 在基于swift的应用程序中,我必须使用设备摄像机以及使用Linea Pro5(LP5)外部条形码扫描器来实现条形码扫描。在应用程序中,必须检查iPhone与Linea Pro5(LP5)设备的连接状态,如果iPhone未与LP5连接,则必须打开iPhone摄像头,否则将使用LP5进行扫描。我必须对任何UIPutton进行的扫描驻留在应用程序屏幕上。 我的问题是,当我调用connect()方法时,

  • 我正在为平板电脑开发一个android应用程序(SynchroDigital iNOSP10-4.0 RES型号),我想使用ZXing库扫描包含字符串的QRcode。它会在我需要时启动扫描仪,但我无法扫描任何东西。 实际上,如果我直接使用条形码扫描仪应用程序,它甚至不起作用,黄色的点出现了,但什么也没有发生,无论亮度、距离或二维码的复杂性(尝试使用一个只包含字母“a”的巨大二维码),它都不会起作用