Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android addTextChangedListener引发堆栈溢出错误_Android - Fatal编程技术网

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))时
触发areahaTextChangedListener并调用
areasqm.setText(String.valueOf(val*10000)),因此areasqmTextChangedListener也会被触发,并调用
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))时
触发areahaTextChangedListener并调用
areasqm.setText(String.valueOf(val*10000)),因此areasqmTextChangedListener也会被触发,并调用
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错误,但无论如何还是要感谢您。我很感激!