android - EditText 焦点消失,条码扫描器读取条码时

标签 android android-edittext focus

我需要读取应用程序的条形码。我为此使用触发条形码扫描仪。通过 USB 进行通信。

如您所知,条形码扫描仪的工作方式类似于键盘。当设备读取条形码时,它会尝试将值写入具有焦点的输入。并且用户按下触发器,条码扫描器工作直到 条码读取成功。然后它自己进入待机模式。读取大量条码的理想方式。

问题是在用户按下触发器并读取条码后,EditText 的焦点消失了。焦点将随机转到同一布局中的另一个 View 。当用户尝试再读取一个条形码时,操作失败,因为相关的 EditText 没有焦点。

我尝试了什么?

android:windowSoftInputMode="stateAlwaysVisible"

将以上行添加到 list 文件

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年后,我意识到上面的做法是完全错误的。这里有更好的方法,我不会删除旧方法,因为它可以为其他人工作。

你应该覆盖 dispatchKeyEvent在将所有关键事件发送到窗口之前拦截它们。请务必为应该正常处理的关键事件调用此实现。

    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;
    }

最佳答案

基本上,当用户按下触发器时,它会触发 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;
        }
    });

希望对你有帮助~

关于android - EditText 焦点消失,条码扫描器读取条码时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972214/

相关文章:

android - 更改 Actionbar 中搜索的图标

android - 当前上下文中不存在名称 'Resource'

android - Android 的 SQLite DB 问题

android - 从 Android 中的 GridLayout 和 EditBox 中删除默认焦点颜色

android - 自定义 Android 键盘焦点问题

java - 我必须单击该按钮两次才能使其工作

android - Whatsapp 身份验证如何工作?

android - 负数输入(EditText)得到无符号

jQuery 模糊有一个异常(exception)

Android 远程方法 (AIDL) 与 Intents - 性能和电池使用情况