TextWatcher用于多个EditText

时间:2013-04-19 18:53:52

标签: android android-edittext textwatcher

我希望能够根据3 EditText中的2个中的输入来计算某些内容。例如:我在ET 1和2中输入 - >我在ET 3中得到一个计算.ET 1和3 - >在ET 2中计算......等等。

我让它与2 EditText一起工作,但是我得到了一个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;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

好的,我刚刚开始重新审核我的代码。为什么没有人找到答案?这真的不是那么难。

所以我只是将每个try块中的if-statements与另一个if-statement包围在一起,如下所示:

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

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

答案 1 :(得分:0)

您应该检查EditText中的更改是否因其他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;
}

答案 2 :(得分:0)

可以使用Editable,您需要使用hashCodeFunction

@Override
public void afterTextChanged(Editable s) {
    if (editText.getText().hashCode() == s.hashCode()) {
        // some
    }
}