我有这样的代码:
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));
}
});每当我在其中一个java.lang.StackOverflowError.中输入一个值时,我的应用程序就会崩溃并抛出EditTexts
为什么?如何解决这个问题?
发布于 2016-06-01 07:43:37
原因是:当您调用TextChangedListener of areaha时,会触发areaha并调用areasqm.setText(String.valueOf(val*10000));,因此也会触发areasqm并调用areaha.setText(String.valueOf(val/10000));。所以你有一个永恒的循环,因此这个java.lang.StackOverflowError..
你可以试试这样的东西。
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);
}发布于 2016-06-01 07:45:23
您得到了这个错误,因为根据您的代码,它处于无限循环中,它们都是编辑文本、连续更新彼此的值。
发布于 2016-06-01 08:12:06
如前所述,当您更改编辑文本时,java.lang.StackOverflowError是由于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));
}
}但请记住,这是一个条件,您的value_entered是int,而不是双倍或浮点数(十进制)。
希望这会有所帮助;)
https://stackoverflow.com/questions/37562301
复制相似问题