The TextWatcher
antarmuka memiliki 3 callback metode yang semuanya disebut dalam urutan berikut ketika perubahan terjadi pada teks:
beforeTextChanged(CharSequence s, int start, int count, int after)
Dipanggil sebelum perubahan diterapkan ke teks.
The s
parameter teks sebelum perubahan diterapkan.
The start
parameter adalah posisi dari awal bagian berubah dalam teks.
The count
parameter adalah panjang dari bagian berubah dalam s
urutan sejak start
posisi.
Dan after
parameternya adalah panjang urutan baru yang akan menggantikan bagian s
urutan dari start
menjadi start+count
.
Anda tidak boleh mengubah teks diTextView
from metode ini (dengan menggunakan myTextView.setText(String newText)
).
onTextChanged(CharSequence s, int start, int before, int count)
Mirip dengan beforeTextChanged
metode tetapi dipanggil setelah teks berubah.
The s
parameter teks setelah perubahan telah diterapkan.
The start
parameter adalah sama seperti dalam beforeTextChanged
metode.
The count
parameter adalah after
parameter dalam metode beforeTextChanged.
Dan before
parameternya adalah count
parameter dalam metode beforeTextChanged.
Anda tidak boleh mengubah teks di TextView
from metode ini (dengan menggunakan myTextView.setText(String newText)
).
afterTextChanged(Editable s)
Anda dapat mengubah teks di TextView
from metode ini.
/! \ Peringatan: Ketika Anda mengubah teks di TextView
, itu TextWatcher
akan dipicu lagi, memulai loop tak terbatas. Anda kemudian harus menambahkan seperti boolean _ignore
properti yang mencegah pengulangan tak terbatas.
Contoh:
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...
}
Ringkasan:
Kelas siap pakai: TextViewListener
Secara pribadi, saya membuat pendengar teks khusus saya, yang memberi saya 4 bagian dalam string terpisah, yang, bagi saya, jauh lebih intuitif untuk digunakan.
/**
* 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;
}
}
Contoh:
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();
}
}