2010-11-11 27 views
3

J'utilise un lecteur de code-barres qui insère une chaîne de codes-barres dans un EditText au format "12345 \ n". Au lieu d'utiliser un bouton de recherche, je veux déclencher l'événement de recherche par le caractère "\ n". Je addTextChangedListener de TextEdit et à l'intérieur de cette fonction que je fais:EditText, OnKeyListener ou TextWatcher (lecture de codes-barres)

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

Il fonctionne très bien pour la première fois, mais je veux aussi effacer le EditText après chaque balayage. Mais il n'est pas possible de faire cela à l'intérieur de l'événement afterTextChanged, car il se passe dans une boucle récursive ou quelque chose comme ça.

est ici l'autre solution, qui fonctionne très bien:

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

En fait, je ne suis pas sûr quelle est la bonne façon de le faire il. Peut-être que je peux utiliser l'événement OnKeyListener d'EditText. Aucune suggestion?

Merci

+2

où avez-vous effacer le texte? avec votre première solution qui se termine par une boucle sans fin? essayez de l'effacer dans le si cela vérifie le dernier caractère. Si vous le faites, il devrait fonctionner, je suppose. (raison: linebreak ne sera là que la première fois qu'il est appelé et ne sera pas là quand il sera appelé à nouveau à cause de l'effacement) –

+0

Comment se fait-il que vous utilisiez @Override pour onKey(). N'est-ce pas une méthode abstraite? Donc, il ne devrait pas exiger un @ Override..right? – faizal

Répondre

4

Si vous désactivez le contenu EditText dans le afterTextChanged(), vous ne devriez pas avoir une boucle infinie.

@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

Code de @Hrk ne fonctionne pas pour moi, parce que la méthode myEditText.setString() n'existe pas.

Voici une façon:

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