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