Android 当条形码扫描仪读取条形码时,编辑文本焦点消失

Android 当条形码扫描仪读取条形码时,编辑文本焦点消失,android,android-edittext,focus,Android,Android Edittext,Focus,我需要读取应用程序的条形码。我正在使用触发器条形码扫描仪。通过USB进行通信 如你所知,条形码扫描器的工作原理就像键盘一样。当设备读取条形码时,它会尝试将值写入具有焦点的输入。用户按下触发器,条形码扫描器工作到 条形码已成功读取。然后进入待机模式。读取大量条形码的理想方法 问题在于,用户按下触发器并读取条形码后,编辑文本的焦点消失。焦点将随机转到同一布局中的另一个视图。当用户尝试读取一个或多个条形码时,操作失败,因为没有关注相关文本 我尝试了什么? android:windowSoftInput

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

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

问题在于,用户按下触发器并读取条形码后,编辑文本的焦点消失。焦点将随机转到同一布局中的另一个视图。当用户尝试读取一个或多个条形码时,操作失败,因为没有关注相关文本

我尝试了什么?

android:windowSoftInputMode="stateAlwaysVisible"
    handlerFocus = new Handler();
    final int delay = 1000; //milliseconds

    handlerFocus.postDelayed(new Runnable()
    {
        public void run()
        {
            edtBarcode.requestFocus();
            handlerFocus.postDelayed(this, delay);
        }
    }, delay);
在清单文件的上方添加了一行

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何时失去焦点。但是我不能把它分配回去。我确保编辑文本在触摸模式下可聚焦

我是如何解决的?

android:windowSoftInputMode="stateAlwaysVisible"
    handlerFocus = new Handler();
    final int delay = 1000; //milliseconds

    handlerFocus.postDelayed(new Runnable()
    {
        public void run()
        {
            edtBarcode.requestFocus();
            handlerFocus.postDelayed(this, delay);
        }
    }, delay);
我知道这个解决方案不好。那么,如何在不打开键盘的情况下使焦点始终保持在同一编辑文本中呢

关键编辑

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

您可以试试:
edtBarcode.setSelectAllOnFocus(true)

要隐藏键盘,您可以尝试以下方法:


我希望我能帮上忙。

基本上,当用户按下触发器时,它会触发
编辑文本上的
按键事件。根据扫描仪的配置,可以是
KEYCODE\u选项卡
KEYCODE\u输入

所以我所做的是听
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;
        }
    });
希望这有帮助~

试试这个: 在您的清单中:

<activity android:name=".Activity.TransferBtwCenterAndStoresActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden"/>
edtBarcode.setFocusableInTouchMode(true);
edtBarcode.requestFocus();

在editText中设置下面提到的侦听器:

edtxt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int keyCode, KeyEvent event) {
            if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) {
                return false;
            }
            if (keyCode == EditorInfo.IME_ACTION_DONE) {
                //this is for DONE button in soft keyboard is pressed
                //your logic
                return true;
            }
            if (keyCode != EditorInfo.IME_ACTION_NEXT && keyCode != EditorInfo.IME_NULL) {
                return false;
            }
            //your logic
            // this will be called when hardware enter button is pressed eg. barcode enter enter code here
            return true;
        }
    };)

在用户按下触发器且条形码读取过程成功后,焦点何时发生变化。感谢您的回答,但它不起作用,其行为仍然相同。最后一个字符是“\n”,表示KEYCODE\u ENTER。非常感谢,它的工作原理就像你在上面发布的一样。