EditText, OnKeyListener или TextWatcher (сканирование штрих-кода) - PullRequest
3 голосов
/ 11 ноября 2010

Я использую сканер штрих-кода, который вставляет строку штрих-кода в EditText в этом формате «12345 \ n». Вместо того, чтобы использовать кнопку поиска, я хочу вызвать событие поиска с помощью символа "\ n". Я использовал addTextChangedListener TextEdit и внутри той функции, которую я делаю:

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

На самом деле я не уверен, как правильно это сделать. Может быть, я могу использовать событие OnTeyListener EditText. Есть предложения?

Спасибо

Ответы [ 2 ]

5 голосов
/ 12 ноября 2010

Если вы очистите содержимое 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); 
      }
  } 
3 голосов
/ 17 ноября 2011

Код @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();
  }
});
...