问题描述
||
TextView textView=new TextView(context);
textView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s,int start,int before,int count) {
}
@Override
public void beforeTextChanged(CharSequence s,int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
s.append(\"A\");
}
});
如果我们在TextView
上添加一个TextWatcher
,并且我想在此TextView
后面附加一个字母,则每次用户在其中写一个字母时,但这都会不断地调用TextWatcher
Listener,以此类推到StackOverFlow error
,所以如何追加没有重新调用“ 1”侦听器的文本?
解决方法
afterTextChanged的文档说:
调用此方法以通知您s内某处的文本已更改。从此回调中进一步对s进行更改是合理的,但请注意不要陷入无限循环,因为您进行的任何更改都将导致递归再次调用此方法。 (由于其他afterTextChanged()方法可能已经进行了其他更改并使偏移量无效,因此未通知您更改的位置。但是,如果您需要在此处知道,可以在
onTextChanged(CharSequence,int,int)
中使用setSpan(Object,int)
标记您的位置,然后从中查找在这里跨度结束。
因此,每every9ѭ,您又call afterTextChanged()
,依此类推。
, 这简单:
@Override
public void afterTextChanged(Editable s) {
editText.removeTextChangedListener(this);
//Any modifications at this point will not be detected by TextWatcher,//so no more StackOverflowError
s.append(\"A\");
editText.addTextChangedListener(this);
}
, 避免stackoverflow的另一种方法:
TextView textView=new TextView(context);
textView.addTextChangedListener(new TextWatcher() {
boolean editing=false;
@Override
public void onTextChanged(CharSequence s,int start,int before,int count) {
}
@Override
public void beforeTextChanged(CharSequence s,int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (!editing){
editing=true;
s.append(\"A\");
editing=false;
}
}
});
, Kotlin版本
editText.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
if (s.toString().isNotBlank()) {
val formattedValue: String = // Do some formatting
editText.removeTextChangedListener(this)
editText.setText(formattedValue)
editText.setSelection(editText.text.toString().length)
editText.addTextChangedListener(this)
}
}
override fun beforeTextChanged(s: CharSequence?,start: Int,before: Int,count: Int) { }
override fun onTextChanged(s: CharSequence?,count: Int) {
}
})