2010-11-11 20 views
3

我正在使用条形码扫描器,以此格式“12345 \ n”将条形码字符串插入到EditText中。我想通过“\ n”字符来触发搜索事件,而不是使用搜索按钮。我用文本编辑的addTextChangedListener和函数中我做:EditText,OnKeyListener或TextWatcher(条码扫描)

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

你在哪里清除文本?你的第一个解决方案以无限循环结束?尝试在如果检查最后一个字符的情况下清除它。如果你在那里做,它应该工作我猜。 (原因:linebreak只会在第一次被调用时才会出现,因为清除后会再次被调用,因此不会在那里) – 2010-11-11 06:33:23

+0

您如何使用@Override for onKey()。这不是一个抽象的方法吗?所以它不应该需要@覆盖..正确? – faizal 2013-12-17 16:28:15

回答

4

如果清除在afterTextChanged()EditText内容,你不应该有一个无限循环。

@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

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