addTextChangedListener引发StackOverflow错误

Eth*_*sin 1 android

我有以下代码:

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));
    }      
});
Run Code Online (Sandbox Code Playgroud)

每当我在其中一个EditTexts中键入一个值时,我的应用程序就会崩溃并引发java.lang.StackOverflowError

为什么?如何解决这个问题?

Ale*_*der 5

其原因是:当你打电话areaha.setText(String.valueOf(val/10000));TextChangedListenerareaha被触发和调用areasqm.setText(String.valueOf(val*10000));,所以TextChangedListenerareasqm被触发过和电话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);
}
Run Code Online (Sandbox Code Playgroud)