1

我希望能够根据 2 of 3 中的输入来计算一些东西EditText。例如:我在 ET 1 和 2 中进行输入 -> 我在 ET 3 中进行计算。ET 1 和 3 -> 在 ET 2 中进行计算...等等。

我让它与 2 一起工作,EditText但与 3 我得到一个 StackOverFlowError。

private class GenericTextWatcher implements TextWatcher {

    private View view;

    private GenericTextWatcher(View view) {
        this.view = view;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1,
            int i2) {
    }

    public void onTextChanged(CharSequence charSequence, int i, int i1,
            int i2) {
    }

    public void afterTextChanged(Editable editable) {
        switch (view.getId()) {
        case R.id.liter_input:
            try {
                if (amount_widget.getText().toString().equals(" ") == false
                        || literPrice_widget.getText().toString()
                                .equals(" ") == false
                        || price_widget.getText().toString().equals(" ") == false) {
                    double editTextCalc = Double.parseDouble(amount_widget
                            .getText().toString())
                            * Double.parseDouble(literPrice_widget
                                    .getText().toString());
                    editTextCalc = Math.round(editTextCalc * 100) / 100.0;
                    price_widget.setText(String.valueOf(decimalFormat
                            .format(editTextCalc)));
                }

            } catch (Exception e) {
                // TODO: handle exception
            }
            break;
        case R.id.literprice_input:
            try {
                if (amount_widget.getText().toString().equals(" ") == false
                        || literPrice_widget.getText().toString()
                                .equals(" ") == false
                        || price_widget.getText().toString().equals(" ") == false) {
                    double editTextCalc = Double.parseDouble(amount_widget
                            .getText().toString())
                            * Double.parseDouble(literPrice_widget
                                    .getText().toString());
                    editTextCalc = Math.round(editTextCalc * 100) / 100.0;
                    price_widget.setText(String.valueOf(decimalFormat
                            .format(editTextCalc)));
                }

            } catch (Exception e) {
                // TODO: handle exception
            }
            break;
        case R.id.price_input:
            try {
                if (amount_widget.getText().toString().equals(" ") == false
                        || literPrice_widget.getText().toString()
                                .equals(" ") == false
                        || price_widget.getText().toString().equals(" ") == false) {
                    double editTextCalc = Double.parseDouble(amount_widget
                            .getText().toString())
                            / Double.parseDouble(price_widget.getText()
                                    .toString());
                    editTextCalc = Math.round(editTextCalc * 100) / 100.0;
                    literPrice_widget.setText(String.valueOf(decimalFormat
                            .format(editTextCalc)));
                }

            } catch (Exception e) {
                // TODO: handle exception
            }
            break;
        }
    }
}
4

3 回答 3

1

好的,我刚刚开始再次查看我的代码。为什么没有人找到答案?这真的没那么难。

所以我只是if-statements在每个 try 块中用另一个if-statement看起来像这样的块包围:

if(edittext.isFocused()){
   try-catch block
}

现在一切正常。没有StackOverflowException了,因为textwatcher唯一开始它的工作edittext是专注的。文本更改不再触发无限循环。

于 2013-05-04T17:53:35.977 回答
0

您应该检查 an 中的更改是否EditText由于 other 中的更改而发生EditText。在类中创建一个boolean字段并使用以下命令对其进行初始化false

private boolean mIsChanging = false;

检查afterTextChanged()此字段是否存在false或退出:

public void afterTextChanged(Editable editable) {
    if (mIsChanging) {
        return;
    }

    mIsChanging = true;

    // Then do what you did previously...

    mIsChanging = false;
}
于 2013-04-19T19:00:56.853 回答
0

使用 Editable 是可能的,您需要使用 hashCodeFunction

@Override
public void afterTextChanged(Editable s) {
    if (editText.getText().hashCode() == s.hashCode()) {
        // some
    }
}
于 2015-09-17T16:02:18.440 回答