edittext 监听无效_多个EditText 监听矛盾的 解决办法 (Overstack)溢出栈

在Android开发中,当多个EditText互相联动改变值时,可能导致监听器触发死循环并引发StackOverflow错误。解决方法是设置一个标志变量flag,当flag为false时允许监听器执行,为true时阻止执行,避免死循环。在每个EditText的监听器内适当调整flag状态,确保在赋值后重新开启监听。
摘要由CSDN通过智能技术生成

这里有A,B,C 三个edittext,他们三个之间通过后台的计算来改变互相的值。具体来说,A在变得时候,BC会随之而变;B在变得时候AC会随之而变。因此,一开始我给他们三个都分别添加textChangedListener的时候就出现的StackOver 栈溢出的问题。原因是他们进入了死循环!!

解决办法:

自认为很简单的方法,以后不管是editText还是什么控件,出现类似的死循环问题都可以用这个方法解决:

设立一个flag!!

首先默认该flag=false;

9ce1a317d1a18be6e37c871ab956aeb5.png

Then at each editText, we set an addtextChangedListener:

In this Listener, we should implement three functions, here I just use one function:

红色的代码表示的是该flag的用法。当autochange为true的时候它会阻止edittext使用监听器,当它为false的时候,监听器才能继续进行。

a.addTextChangedListener(newTextWatcher (){

@Overridepublic void beforeTextChanged(CharSequence s, int start, intcount,intafter) {//TODO Auto-generated method stub

}

@Overridepublic void onTextChanged(CharSequence s, int start, intbefore,intcount) {//TODO Auto-generated method stub

if(autochange){

autochange=false;

return;

}else{if(s.length()!=0){double edeg =Double.parseDouble(d.getText().toString());double width =Double.parseDouble(String.valueOf(s));

ArrayList list = computeTL2(width,edeg);

autochange=true;

e.setText(list.get(2)+" ");

f.setText(list.get(3)+" ");

b.setText(list.get(0)+" ");

c.setText(list.get(1)+" ");

}

}

}

@Overridepublic voidafterTextChanged(Editable s) {//TODO Auto-generated method stub

}

});

注意:

如果A在改变的时候,会引起B和C改变,而且B和C都有监听器,则需要在给B赋值之后再加一个autochange=true。不然flag又变为false了。

d.addTextChangedListener(newTextWatcher(){

@Overridepublic void beforeTextChanged(CharSequence s, int start, intcount,intafter) {//TODO Auto-generated method stub

}

@Overridepublic void onTextChanged(CharSequence s, int start, intbefore,intcount) {//TODO Auto-generated method stub

if(autochange){

autochange=false;//return;

}if(s.length()!=0){double edeg =Double.parseDouble(String.valueOf(s));double Z =Double.parseDouble(c.getText().toString());

ArrayList list =computeTL(Z,edeg);

autochange=true;

a.setText(list.get(0)+" ");

autochange=true;

b.setText(list.get(1)+" ");

e.setText(list.get(2)+" ");

f.setText(list.get(3)+" ");

}

}

@Overridepublic voidafterTextChanged(Editable s) {//TODO Auto-generated method stub

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值