多个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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值