微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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) {

    }

})
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?