Android EditText、OnKeyListener或TextWatcher(条形码扫描)
我正在使用条形码扫描仪,该扫描仪将条形码字符串以这种格式“12345\n”插入EditText。我希望通过“\n”字符触发搜索事件,而不是使用搜索按钮。我使用了TextEdit的addTextChangedListener,并在该函数中执行以下操作:Android EditText、OnKeyListener或TextWatcher(条形码扫描),android,barcode,android-edittext,barcode-scanner,Android,Barcode,Android Edittext,Barcode Scanner,我正在使用条形码扫描仪,该扫描仪将条形码字符串以这种格式“12345\n”插入EditText。我希望通过“\n”字符触发搜索事件,而不是使用搜索按钮。我使用了TextEdit的addTextChangedListener,并在该函数中执行以下操作: protected TextWatcher readBarcode = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, in
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。但在PostTextChanged事件中不可能这样做,因为它将进入一个递归循环或其他什么
下面是另一个解决方案,效果非常好:
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事件。有什么建议吗
谢谢如果您清除
后文本更改()
中的编辑文本
内容,您不应该有一个无限循环
@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);
}
}
@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();
}
});
你在哪里清除文本?你的第一个解决方案以无止境的循环结束?如果检查最后一个字符,请尝试在中清除它。如果你在那里做的话,我想应该可以。(原因:linebreak只有在第一次调用时才会出现,而在再次调用时不会出现,因为清除了),为什么要使用@Override for onKey()。这不是一种抽象的方法吗?所以它不需要@Override,对吗?