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

OK、コードをもう一度見直し始めました。なぜ誰も答えを見つけられなかったのですか?それは本当に難しいことではありません。

if-statementsしたがって、すべての try ブロックif-statementを次のような別のブロックで囲んだだけです。

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

そして今、すべてがうまく機能しています。焦点を合わせたところでしか仕事がStackOverflowException始まらないので、もうありません。テキストの変更によって無限ループがトリガーされることはなくなりました。textwatcheredittext

于 2013-05-04T17:53:35.977 に答える
0

EditTextother で行われた変更が原因で の変更が発生したかどうかを確認する必要がありますEditTextbooleanクラスにフィールドを作成し、次のように初期化し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 に答える