这里有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(new TextWatcher (){ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 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<Double> 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)+" "); } } } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } });
注意:
如果A在改变的时候,会引起B和C改变,而且B和C都有监听器,则需要在给B赋值之后再加一个autochange=true。不然flag又变为false了。
d.addTextChangedListener(new TextWatcher(){ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 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<Double> 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)+" "); } } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } });