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