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