Android addTextChangedListener引发堆栈溢出错误
我有以下代码:Android addTextChangedListener引发堆栈溢出错误,android,Android,我有以下代码: areasqm.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override
areasqm.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areasqm.getText().toString());
areaha.setText(String.valueOf(val/10000));
}
});
areaha.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areaha.getText().toString());
areasqm.setText(String.valueOf(val*10000));
}
});
每当我在其中一个EditText中键入值时,我的应用程序就会崩溃并抛出java.lang.StackOverflowerError
为什么?如何修复此问题?原因是:调用
areaha.setText(String.valueOf(val/10000))时
触发areaha的TextChangedListener并调用areasqm.setText(String.valueOf(val*10000))编码>,因此areasqm的TextChangedListener也会被触发,并调用areaha.setText(String.valueOf(val/10000))代码>。所以你有一个永恒的循环,结果是java.lang.StackOverflowerError.
你可以试试这样的
private TextWatcher areasmlWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areasqm.getText().toString());
areaha.removeTextChangedListener(areahaWatcher);
areaha.setText(String.valueOf(val / 10000));
areaha.addTextChangedListener(areahaWatcher);
}
};
private TextWatcher areahaWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areaha.getText().toString());
areasqm.removeTextChangedListener(areasmlWatcher);
areasqm.setText(String.valueOf(val*10000));
areasqm.addTextChangedListener(areasmlWatcher);
}
};
private void someMethod() {
areasqm.addTextChangedListener(areasmlWatcher);
areaha.addTextChangedListener(areahaWatcher);
}
原因是:调用areaha.setText(String.valueOf(val/10000))时
触发areaha的TextChangedListener并调用areasqm.setText(String.valueOf(val*10000))编码>,因此areasqm的TextChangedListener也会被触发,并调用areaha.setText(String.valueOf(val/10000))代码>。所以你有一个永恒的循环,结果是java.lang.StackOverflowerError.
你可以试试这样的
private TextWatcher areasmlWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areasqm.getText().toString());
areaha.removeTextChangedListener(areahaWatcher);
areaha.setText(String.valueOf(val / 10000));
areaha.addTextChangedListener(areahaWatcher);
}
};
private TextWatcher areahaWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areaha.getText().toString());
areasqm.removeTextChangedListener(areasmlWatcher);
areasqm.setText(String.valueOf(val*10000));
areasqm.addTextChangedListener(areasmlWatcher);
}
};
private void someMethod() {
areasqm.addTextChangedListener(areasmlWatcher);
areaha.addTextChangedListener(areahaWatcher);
}
您之所以会出现此错误,是因为根据您的代码,它处于无限循环中,两个编辑文本连续更新彼此值您之所以会出现此错误,是因为根据您的代码,它处于无限循环中,两个编辑文本连续更新彼此值如上所述,java.lang.StackOverflowerError是由于在更改编辑文本时递归调用了onTextChanged()
和setText()
由于您试图将输入的值乘以1000,因此我可以考虑:
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areaha.getText().toString());
if (val % 10000 != 0) {
val = val * 10000;
areasqm.setText(String.valueOf(val));
}
}
但请记住,这是一个条件,您输入的值是int,而不是double或float(十进制)
希望这有帮助;) 如前所述,java.lang.StackOverflowerError是由于在更改编辑文本时递归调用onTextChanged()
和setText()
由于您试图将输入的值乘以1000,因此我可以考虑:
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
double val = Double.parseDouble(areaha.getText().toString());
if (val % 10000 != 0) {
val = val * 10000;
areasqm.setText(String.valueOf(val));
}
}
但请记住,这是一个条件,您输入的值是int,而不是double或float(十进制)
希望这有帮助;) 如果(s.length()==0){//code}尝试在正在进行递归调用的PostTextChanged()而不是onTextChanged()中设置值,则第一个检查值是否为null。(textChanged->setText->textChanged…@Mehta,它不工作@如果(s.length()==0){//you code}尝试在PostTextChanged()而不是onTextChanged()中设置值,则第一个检查值是否为null。如果您正在进行递归调用,请尝试在那里设置值。(textChanged->setText->textChanged…@Mehta,它不工作@我试着回答下面的问题。那么我该如何修复它呢?请通过此链接尝试在焦点增益上添加addTextChangedListener并在编辑文本失去焦点时删除它。我该如何修复它呢?请通过此链接尝试在焦点增益上添加addTextChangedListener并在编辑文本失去焦点时删除它。您应该更改代码的逻辑。我不知道您希望得到什么结果。您可以将编辑后的值设置为另一个TextView
。您应该更改代码的逻辑。我不知道您想要的结果是什么。您可以将编辑后的值改为另一个TextView
。仍然不起作用。。它抛出StackOverflow错误,但无论如何还是要感谢您。我很感激!仍然不工作。。它抛出StackOverflow错误,但无论如何还是要感谢您。我很感激!