当其他 Edittext 改变时更新 Edittext

Update Edittext when other Edittext change

我正在尝试根据其他 EditTexts 更新单个 EditText。出于某种原因,一切正常,直到我必须设置文本,然后我得到一个连续的错误列表。我似乎无法找出原因或这是否是最佳做法。任何帮助,将不胜感激。如果我把文字的设置注释掉。我的应用程序运行良好。这是我的代码:

 final Boolean[] hasValue = {false};
    ArrayList<EditText> editTexts = new ArrayList<>(); // Container list
    ArrayList<Double> values = new ArrayList<>(); // value list
    editTexts.add(IBalance); // editTexts[0]
    editTexts.add(Trading); // editTexts[1]
    editTexts.add(Binary); // editTexts[2]
    editTexts.add(Referrals); // editTexts[3]
    editTexts.add(Leader1); // editTexts[4]
    editTexts.add(Leader2); // editTexts[5]
    editTexts.add(Deposit); // editTexts[6]
    editTexts.add(Withdrawal); // editTexts[7]
    editTexts.add(Total); // editTexts[8]

    for (final EditText editText : editTexts) { //need to be final for custom behaviors
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                /*if (editText.getText().toString().equals("0")) {
                    editText.setText("");

                }*/
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (editText.getText().toString().equals("") || editText.getText().toString().equals("0")) {
                    editText.setText("0.0");
                    editText.setSelection(editText.getText().length());
                }
                else if(editText.getText().toString().equals("0.0"))
                    editText.setSelection(editText.getText().length());
            }

            @Override
            public void afterTextChanged(Editable s) {
                values.add(Double.parseDouble(IBalance.getText().toString())); //[0]
                values.add(Double.parseDouble(Trading.getText().toString())); //[1]
                values.add(Double.parseDouble(Binary.getText().toString())); //[2]
                values.add(Double.parseDouble(Referrals.getText().toString())); //[3]
                values.add(Double.parseDouble(Leader1.getText().toString())); //[4]
                values.add(Double.parseDouble(Leader2.getText().toString())); //[5]
                values.add(Double.parseDouble(Deposit.getText().toString())); //[6]
                values.add(Double.parseDouble(Withdrawal.getText().toString())); //[7]
                for (final Double db : values) {
                    hasValue[0] = db != null;
                }
                double total = 0;
                if(hasValue[0]=true)
                {
                    total = values.get(0)+values.get(1)+values.get(2)+values.get(3)+values.get(4)+values.get(5)+values.get(6)-values.get(0);
//ERROR OCCURS      Total.setText(String.valueOf(total)); //ERROR OCCURS
                }
                values.clear();
            }
        });
    }

这是 运行 控制台中的错误屏幕:

它重复了很长时间以致于错误的开头被截断了。这是应用程序的外观:

你检查值是否为空是不正确的。

  1. boolean[] hasValue = {false} 替换为 boolean hasValue = true
  2. 而不是这个,
for (final Double db : values) {
    hasValue[0] = db != null;
}

使用这个:

for (final Double db : values) {
    if (db == null) {
        hasValue = false;
        break;
    }
}

这是因为在原始版本中,您将 hasValue 编辑为仅依赖于 values 的最后一个元素。

此外,在 total = ... 行中,您使用了 values.get(0)-values.get(0)。这引起了我的好奇。

您的问题是,您还将 total 添加到您的列表中。这就是为什么 total 也得到 Listener 的原因。

在它自己的 Listener 中设置 EditText 的文本会创建无限循环。

删除此行

editTexts.add(Total); // editTexts[8]