Các TextWatcher
giao diện có 3 phương pháp callbacks được tất cả gọi theo thứ tự sau khi một sự thay đổi xảy ra với nội dung:
beforeTextChanged(CharSequence s, int start, int count, int after)
Được gọi trước khi các thay đổi được áp dụng cho văn bản.
Các s
tham số là các văn bản trước khi bất kỳ thay đổi được áp dụng.
Các start
tham số là vị trí của đầu phần thay đổi trong văn bản.
Các count
tham số là chiều dài của phần thay đổi trong s
chuỗi từ start
vị trí.
Và after
tham số là độ dài của chuỗi mới sẽ thay thế một phần của s
chuỗi từ start
đến start+count
.
Bạn không được thay đổi văn bản trong TextView
từ phương pháp này (bằng cách sử dụng myTextView.setText(String newText)
).
onTextChanged(CharSequence s, int start, int before, int count)
Tương tự như beforeTextChanged
phương thức nhưng được gọi sau khi văn bản thay đổi.
Các s
tham số là các văn bản sau khi thay đổi đã được áp dụng.
Các start
tham số là giống như trong các beforeTextChanged
phương pháp.
Các count
tham số là after
tham số trong phương pháp beforeTextChanged.
Và before
tham số là count
tham số trong phương thức beforeTextChanged.
Bạn không được thay đổi văn bản trong TextView
từ phương pháp này (bằng cách sử dụng myTextView.setText(String newText)
).
afterTextChanged(Editable s)
Bạn có thể thay đổi văn bản trong TextView
từ phương pháp này.
/! \ Cảnh báo: Khi bạn thay đổi văn bản trong TextView
, TextWatcher
sẽ được kích hoạt lại, bắt đầu một vòng lặp vô hạn. Sau đó, bạn nên thêm giống như một thuộc boolean _ignore
tính ngăn vòng lặp vô hạn.
Thực hiện:
new TextWatcher() {
boolean _ignore = false; // indicates if the change was made by the TextWatcher itself.
@Override
public void afterTextChanged(Editable s) {
if (_ignore)
return;
_ignore = true; // prevent infinite loop
// Change your text here.
// myTextView.setText(myNewText);
_ignore = false; // release, so the TextWatcher start to listen again.
}
// Other methods...
}
Tóm lược:
Một lớp sẵn sàng để sử dụng: TextViewListener
Cá nhân tôi đã tạo trình nghe văn bản tùy chỉnh của mình, cung cấp cho tôi 4 phần trong các chuỗi riêng biệt, đối với tôi, sử dụng trực quan hơn nhiều.
/**
* Text view listener which splits the update text event in four parts:
* <ul>
* <li>The text placed <b>before</b> the updated part.</li>
* <li>The <b>old</b> text in the updated part.</li>
* <li>The <b>new</b> text in the updated part.</li>
* <li>The text placed <b>after</b> the updated part.</li>
* </ul>
* Created by Jeremy B.
*/
public abstract class TextViewListener implements TextWatcher {
/**
* Unchanged sequence which is placed before the updated sequence.
*/
private String _before;
/**
* Updated sequence before the update.
*/
private String _old;
/**
* Updated sequence after the update.
*/
private String _new;
/**
* Unchanged sequence which is placed after the updated sequence.
*/
private String _after;
/**
* Indicates when changes are made from within the listener, should be omitted.
*/
private boolean _ignore = false;
@Override
public void beforeTextChanged(CharSequence sequence, int start, int count, int after) {
_before = sequence.subSequence(0,start).toString();
_old = sequence.subSequence(start, start+count).toString();
_after = sequence.subSequence(start+count, sequence.length()).toString();
}
@Override
public void onTextChanged(CharSequence sequence, int start, int before, int count) {
_new = sequence.subSequence(start, start+count).toString();
}
@Override
public void afterTextChanged(Editable sequence) {
if (_ignore)
return;
onTextChanged(_before, _old, _new, _after);
}
/**
* Triggered method when the text in the text view has changed.
* <br/>
* You can apply changes to the text view from this method
* with the condition to call {@link #startUpdates()} before any update,
* and to call {@link #endUpdates()} after them.
*
* @param before Unchanged part of the text placed before the updated part.
* @param old Old updated part of the text.
* @param aNew New updated part of the text?
* @param after Unchanged part of the text placed after the updated part.
*/
protected abstract void onTextChanged(String before, String old, String aNew, String after);
/**
* Call this method when you start to update the text view, so it stops listening to it and then prevent an infinite loop.
* @see #endUpdates()
*/
protected void startUpdates(){
_ignore = true;
}
/**
* Call this method when you finished to update the text view in order to restart to listen to it.
* @see #startUpdates()
*/
protected void endUpdates(){
_ignore = false;
}
}
Thí dụ:
myEditText.addTextChangedListener(new TextViewListener() {
@Override
protected void onTextChanged(String before, String old, String aNew, String after) {
// intuitive usation of parametters
String completeOldText = before + old + after;
String completeNewText = before + aNew + after;
// update TextView
startUpdates(); // to prevent infinite loop.
myEditText.setText(myNewText);
endUpdates();
}
}