这里有A,B,C 三个edittext,他们三个之间通过后台的计算来改变互相的值。具体来说,A在变得时候,BC会随之而变;B在变得时候AC会随之而变。因此,一开始我给他们三个都分别添加textChangedListener的时候就出现的StackOver 栈溢出的问题。原因是他们进入了死循环!!
解决办法:
自认为很简单的方法,以后不管是editText还是什么控件,出现类似的死循环问题都可以用这个方法解决:
设立一个flag!!
首先默认该flag=false;
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
}
});