zoukankan      html  css  js  c++  java
  • 多个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
                    
                }
                
            });
  • 相关阅读:
    小笔记
    过滤器实现Token验证(登录验证+过期验证)---简单的实现
    在MVC过滤器中获取触发的Controller、Action、参数 等
    C#强制类型转换
    iTextSharp生成pdf
    多选文件批量上传前端(ajax*formdata)+后台(Request.Files[i])---input+ajax原生上传
    out string
    松软科技web教程:JavaScript HTML DOM 事件监听器
    JavaScript HTML DOM 事件
    松软科技Web课堂:JavaScript HTML DOM 动画
  • 原文地址:https://www.cnblogs.com/lws520/p/5818456.html
Copyright © 2011-2022 走看看