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

这里有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
                
            }
            
        });
原文地址:https://www.cnblogs.com/lws520/p/5818456.html