我正在使用条形码扫描器将条形码字符串插入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事件。有什么建议吗?
由于
答案 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();
}
});