【问题标题】:EditText, OnKeyListener or TextWatcher (barcode scanning)EditText、OnKeyListener 或 TextWatcher(条码扫描)
【发布时间】:2011-05-08 06:44:13
【问题描述】:

我正在使用条形码扫描仪,它将条形码字符串以这种格式“12345\n”插入到 EditText 中。我不想使用搜索按钮,而是想通过“\n”字符触发搜索事件。我使用了 TextEdit 的 addTextChangedListener 并在我正在执行的那个函数中:

protected TextWatcher readBarcode = new TextWatcher() { 
 @Override
 public void onTextChanged(CharSequence s, int start, int before, int count) {
  // TODO Auto-generated method stub

 }

 @Override
 public void beforeTextChanged(CharSequence s, int start, int count,
   int after) {
  // TODO Auto-generated method stub

 }

 @Override
 public void afterTextChanged(Editable s) {
  // TODO Auto-generated method stub
  char lastCharacter = s.charAt(s.length() - 1);

  if (lastCharacter == '\n') {
   String barcode = s.subSequence(0, s.length() - 1).toString();
   searchBarcode(barcode);
  }
 }
};

第一次效果很好,但我也想在每次扫描后清除 EditText。但不可能在 afterTextChanged 事件中这样做,因为它会进入递归循环或其他东西。

这是另一个解决方案,效果很好:

editBarcode.setOnKeyListener(new OnKeyListener() {

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    String barcode = editBarcode.getText().toString();

    if (keyCode == KeyEvent.KEYCODE_ENTER && barcode.length() > 0) {
        editBarcode.setText("");
        searchBarcode(barcode);
        return true;
    }

    return false;
}
});

实际上,我不确定什么是正确的方法。也许我可以使用 EditText 的 OnKeyListener 事件。有什么建议吗?

谢谢

【问题讨论】:

  • 你在哪里清除文本?您的第一个解决方案以无限循环结束?尝试在检查最后一个字符的 if 中清除它。如果你在那里做它应该工作我猜。 (原因:linebreak只会在第一次调用的时候出现,再次调用的时候不会出现,因为清除了)
  • 你为什么要使用@Override for onKey()。不是抽象方法吗?所以它不应该需要@Override..对吗?

标签: android barcode android-edittext barcode-scanner


【解决方案1】:

如果清除afterTextChanged()中的EditText内容,就不应该出现死循环。

 @Override 
 public void afterTextChanged(Editable s) { 
  if (s.length > 0) {

      char lastCharacter = s.charAt(s.length() - 1); 

      if (lastCharacter == '\n') { 
       String barcode = s.subSequence(0, s.length() - 1).toString();
       myEditText.setString("");
       searchBarcode(barcode); 
      }
  } 

【讨论】:

    【解决方案2】:

    @Hrk 的代码对我不起作用,因为方法 myEditText.setString() 不存在。

    这是一种方法:

    editText.addTextChangedListener(new TextWatcher() {
    
      ...
    
      @Override
      public void afterTextChanged(Editable s) {
        if (s.toString().trim().length() == 0)
          return;
    
        //do your work, then clear the text here
        s.clear();
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-13
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多