EditText,OnKeyListener或TextWatcher(条形码扫描)

时间:2010-11-11 05:05:02

标签: android barcode android-edittext barcode-scanner

我正在使用条形码扫描器将条形码字符串插入EditText,格式为“12345 \ n”。我想用“\ 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事件。有什么建议吗?

由于

2 个答案:

答案 0 :(得分:5)

如果您清除EditText中的afterTextChanged()内容,则不应该有无限循环。

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

答案 1 :(得分:3)

@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();
  }
});