Android:EditText TextWatcher中的无限循环

时间:2012-06-27 14:02:00

标签: android android-edittext

我对这段代码有两个问题。感谢上一个问题中的一些好人,我让它正常工作,但现在我再次看到自己处于一个无限循环中,我不知道它来自哪里。我在这里尝试做的是一个刽子手游戏:处理在EditText(litera)中读取的单个字符,然后我用一个单词(cuvAles)搜索它,然后我想用相应的字母替换下划线。

以下是与问题有关的功能:

litera.addTextChangedListener(new TextWatcher(){
            public void afterTextChanged(Editable s) {}
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){
                 String ghici = litera.getText().toString();

                if(!ghici.equals("")){
                System.out.println(ghici);
                litera.setText("");

                if(cuvAles.contains(ghici)){
                    int poz = 0;
                    while(cuvAles.indexOf(ghici, poz)!= -1){
                        poz = cuvAles.indexOf(ghici);
                        String spatii = cuvant.getText().toString();
                        String spatii2 = spatii.substring(0, poz*2-1) + ghici + spatii.substring(poz*2+1, spatii.length()-2);
                        cuvant.setText(spatii2);
                    }
                }
                else gresite.append(ghici+" ");
                } 
            }   
        }); 

这里有两个问题:

1)String spatii2 = spatii.substring(0, poz*2-1) + ghici + spatii.substring(poz*2+1, spatii.length()-1);抛出StringIndexOutOfBounds异常。我认为这是spatii.length()部分,但我尝试使用-2而它仍然无效。单词与下划线不匹配的原因是我之间有空格要清楚。

2)如果我删除了另一个问题(用常量替换字符串),我得到一个无限循环(我认为这是一个无限循环,因为程序停止响应,我看到logcat中的GC疯狂地工作)。

1 个答案:

答案 0 :(得分:2)

在更新edittext之前删除文本更改侦听器,因为它将继续调用您的文本更改侦听器..

litera.addTextChangedListener(new TextWatcher(){
            public void afterTextChanged(Editable s) {}
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){
                 String ghici = litera.getText().toString();

     litera.removeTextChangedListener(this);            


                if(!ghici.equals("")){
                System.out.println(ghici);
                litera.setText("");

                if(cuvAles.contains(ghici)){
                    int poz = 0;
                    while(cuvAles.indexOf(ghici, poz)!= -1){
                        poz = cuvAles.indexOf(ghici);
                        String spatii = cuvant.getText().toString();
                        String spatii2 = spatii.substring(0, poz*2-1) + ghici + spatii.substring(poz*2+1, spatii.length()-2);
                        cuvant.setText(spatii2);
                    }
                }
                else gresite.append(ghici+" ");
                } 
            }   
        });