Обновляйте Edittext при изменении другого Edittext

#android #android-edittext

#Android #android-edittext

Вопрос:

Я пытаюсь обновить один EditText на основе другого EditTexts . По какой-то причине все работает нормально, пока мне не нужно будет установить текст, после чего я получаю непрерывный список ошибок. Кажется, я не могу понять, почему или если это лучшая практика. Любая помощь будет оценена. Если я прокомментирую настройку текста. Мое приложение работает нормально. Это мой код:

  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. Total является частью вашего for цикла, и вы настраиваетесь Total afterTextChanged , поэтому ваш цикл никогда не закончится. Попробуйте удалить editTexts.add(Total);

Ответ №1:

Ваша проблема в том, что вы также добавляете total в свой список. Вот почему total также получает слушателя.

Установка текста EditText в его собственном прослушивателе создает бесконечный цикл.

Удалите эту строку

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

Ответ №2:

Ваша проверка того, являются ли значения null, неверна.

  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, чтобы оно зависело только от последнего элемента значений.

Кроме того, в total = ... строке, которую вы использовали values.get(0)-values.get(0) . Это вызвало мое любопытство.

Комментарии:

1. Это абсолютно правильно, но не является причиной отображаемой ошибки

2. Спасибо за совет и поиск ошибки в моих расчетах!