#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, неверна.
- Заменить
boolean[] hasValue = {false}
наboolean hasValue = true
. - Вместо этого,
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. Спасибо за совет и поиск ошибки в моих расчетах!