代码之家  ›  专栏  ›  技术社区  ›  NvServices

Codename One-扫描条形码检查新行/输入字符

  •  1
  • NvServices  · 技术社区  · 7 年前

    在Android中,我可以使用setOnEditorActionListener方法轻松检测输入字符,这样当条形码被扫描到文本字段时,我就知道整个条形码是什么时候被读取的。

    [这是请求的Android代码:]

    scanEditText.setOnEditorActionListener(new TextView.OnEditorActionListener()
        {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
            {
                if ( (actionId == EditorInfo.IME_ACTION_DONE) || ((event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN )))
                {
                    System.out.println("   *** ENTER!");
                    return true;
                }
                else
                    return false;
            }
        });
    

    我一直试图在Codename One中复制这一点,但没有成功。我试过了

    • setDoneListener公司
    • addDataChangedListener
    • 文本字段和文本区域上的ActionEvent
    • 覆盖按键和按键释放方法

    但是没有快乐。如果我用setSingleLineTextArea(false)设置一个textField,我可以看到条形码字符出现在框中,后面是我假设的 新行字符,因为下一次扫描出现在新行上。列出的方法似乎都无法捕捉到此事件。如果我将焦点更改为另一个框,则会触发ActionEvent,但我不想每次都移动焦点。

    [这是Codenameone代码]

    gui_searchTextField.setSingleLineTextArea(false);
    gui_searchTextField.setDoneListener(new ActionListener()
    {
         public void actionPerformed(ActionEvent evt)
         {
            Dialog.show("KB", "doneListener " + 
            gui_searchTextField.getText().trim(), "OK", null);
         }
    });
    gui_searchTextField.addDataChangedListener((evt1, evt2) ->
    {
      System.out.println("DataChanged " + gui_searchTextField.getText());
    });
    

    那么,我如何像在Android SDK中那样轻松地捕捉条形码的末尾呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Shai Almog    7 年前

    在所有操作系统中,文本输入对我们来说都是一种特殊情况,因此键直接进入本机操作系统文本编辑,而不是通过Codename One API“旅行”。然而, DataChangeListener 应该为每个键输入调用,所以我不确定这到底是如何发生的。

    我注意到你正在使用 System.out 而不是 Log.p 因此,您可能会错过与更改相关的设备输出。此外,我建议覆盖按键/释放事件,不要开始文本编辑。然后将键值添加到文本字段,而不是让本机输入处理它,例如:

    class MyForm extends Form {
        public void keyReleased(int key) {
            if(isCrLf(key)) {
                // do this...
            } else {
                myTextField.setText(myTextField.getText() + ((char)key));
            }
        }
    }