TextWatcher
อินเตอร์เฟซที่มี 3 วิธีการเรียกกลับซึ่งเรียกว่าทั้งหมดในลำดับต่อไปนี้เมื่อมีการเปลี่ยนแปลงเกิดขึ้นกับข้อความ:
beforeTextChanged(CharSequence s, int start, int count, int after)
เรียกก่อนที่การเปลี่ยนแปลงจะถูกนำไปใช้กับข้อความ พารามิเตอร์ข้อความก่อนการเปลี่ยนแปลงใด ๆ ที่นำมาใช้ พารามิเตอร์เป็นตำแหน่งของจุดเริ่มต้นของการเปลี่ยนแปลงส่วนหนึ่งในข้อความ พารามิเตอร์เป็นความยาวของส่วนที่มีการเปลี่ยนแปลงในลำดับตั้งแต่ตำแหน่ง
และพารามิเตอร์เป็นความยาวของลำดับใหม่ที่จะเข้ามาแทนที่ส่วนหนึ่งของลำดับจากการ
คุณต้องไม่เปลี่ยนข้อความในจากวิธีนี้ (โดยใช้)
s
start
count
s
start
after
s
start
start+count
TextView
myTextView.setText(String newText)
onTextChanged(CharSequence s, int start, int before, int count)
คล้ายกับbeforeTextChanged
วิธีการ แต่เรียกว่าหลังจากข้อความเปลี่ยนไป พารามิเตอร์ข้อความหลังจากที่เปลี่ยนแปลงได้ถูกนำมาใช้ พารามิเตอร์เป็นเช่นเดียวกับในวิธีการ พารามิเตอร์เป็นพารามิเตอร์ในวิธีการ beforeTextChanged
และพารามิเตอร์คือพารามิเตอร์ในเมธอด beforeTextChanged
คุณต้องไม่เปลี่ยนข้อความในจากวิธีนี้ (โดยใช้)
s
start
beforeTextChanged
count
after
before
count
TextView
myTextView.setText(String newText)
afterTextChanged(Editable s)
คุณสามารถเปลี่ยนข้อความในTextView
จากวิธีนี้
! / \ คำเตือน:เมื่อคุณเปลี่ยนข้อความในTextView
ที่TextWatcher
จะถูกเรียกอีกครั้งเริ่มต้นวง จำกัด จากนั้นคุณควรเพิ่มเช่นboolean _ignore
คุณสมบัติที่ป้องกันการวนซ้ำที่ไม่มีที่สิ้นสุด
ตัวอย่าง:
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...
}
สรุป:
คลาสที่พร้อมใช้งาน: TextViewListener
โดยส่วนตัวแล้วฉันสร้างโปรแกรมฟังข้อความที่กำหนดเองซึ่งให้ 4 ส่วนในสตริงแยกกันซึ่งสำหรับฉันแล้วใช้งานง่ายกว่ามาก
/**
* 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;
}
}
ตัวอย่าง:
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();
}
}