0

这段代码有两个问题。感谢上一个问题中的一些好人,我让它正常工作,但现在我再次看到自己处于无限循环中,我不知道这是从哪里来的。我在这里要做的是一个刽子手游戏:处理在 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 疯狂地工作)。

4

1 回答 1

3

在更新您的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+" ");
                } 
            }   
        }); 
于 2012-06-27T14:19:44.250 回答