如何在DataChange上更改TextView文本而不调用TextWatcher Listener

问题描述

||
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) {

    }

})
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...