0

このコードには2つの問題があります。前の質問でここにいた素敵な人たちのおかげで、私はそれを正しく動作させることができましたが、今は再び無限ループに陥っていて、それがどこから来ているのかわかりません。ここで私がやろうとしているのは、絞首刑執行人のゲームです。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+" ");
                } 
            }   
        }); 

ここには2つの問題があります。

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 に答える