首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >addTextChangedListener抛出StackOverflow错误

addTextChangedListener抛出StackOverflow错误
EN

Stack Overflow用户
提问于 2016-06-01 07:37:37
回答 3查看 274关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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..

你可以试试这样的东西。

代码语言:javascript
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 2016-06-01 07:45:23

您得到了这个错误,因为根据您的代码,它处于无限循环中,它们都是编辑文本、连续更新彼此的值。

票数 1
EN

Stack Overflow用户

发布于 2016-06-01 08:12:06

如前所述,当您更改编辑文本时,java.lang.StackOverflowError是由于onTextChanged()setText()的递归调用造成的。

由于您试图将输入的值乘以1000,所以我想做的是:

代码语言:javascript
复制
@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,而不是双倍或浮点数(十进制)。

希望这会有所帮助;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37562301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档