@andrej3337

Как конвертировать валюты с расчетом по любому полю?

Код взят в качестве основы и частично переработан мной. Пока читаю учебник по яве, представляю что должно получиться и пытаюсь на практике что-то освоить. Удалось получить курсы валют по апи. Имеется 4 (хотя на самом деле 5), но важных 4 TextView и 4 спиннера с поиском по лейблам валют. Кнопка с датой для выбора курсов валют по дате.

Черновой вариант нормально работает, кроме одного - расчет производится путем ввода в конкретное поле суммы базовой валюты, а хотелось бы вводить сумму в любом поле с расчетом по другим полям. Вот и вопрос к знатокам как в рамках имеющегося кода это можно было бы реализовать

public void currencyInputs() {
    et1 = (EditText) findViewById(R.id.input1); //это
    et2 = (EditText) findViewById(R.id.input2); //те
    et3 = (EditText) findViewById(R.id.input3); //4
    et4 = (EditText) findViewById(R.id.input4); //поля
    et5 = (EditText) findViewById(R.id.basicValue); //тут еще расчет количества базовых величин (чисто белорусское изобретение)
    etArray.add(et1); //тут ссылки передаем в массив
    etArray.add(et2);
    etArray.add(et3);
    etArray.add(et4);
}


А здесь происходит расчет

private void exchange() {
    EditText baseEt = (EditText) etArray.get(0); // берется первое поле из массива за базовое
    if (baseEt == null || TextUtils.isEmpty(baseEt.toString())) {
        Log.e("EditText Error", "EditText Missing");
        return;
    }

    double baseValue = (Double) Double.valueOf(baseEt.getText().toString());
    //получаем из него содержимое и передаем в цикл и формулу
    for (int i = 1; i < 4; i++) {
        double convertedValue = baseValue / rate[i]; //rate[i] это массив переменных из курсов валют, которые выбраны в спиннерах 

        etArray.get(i).setText(String.valueOf(convertedValue));

    }

    double baseVal = baseValue / 29.0;
    et5.setText(String.valueOf(baseVal));
}


Вот результат на сегодня
611a15a3b9a21656398402.jpeg

Есть мысль каким-то образом за базовое поле брать не с нулевым индексом - etArray.get(0), а то на котором находится курсор или фокус, но не совсем понятно как эту задачу решить, не хватает опыта и знаний.

Может есть у кого идеи?
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ответы на вопрос 3
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Логика реализации примерно следующая:
вам нужен некий event listener, который отслеживает изменения полей. Если было изменено одно из полей, то берем значение этого поля и получаем тип (валюту) данного поля. А далее уже отправляем запрос по АПИ и получаем соответствующие котировки.
Ответ написан
Jacen11
@Jacen11
andrej3337,
может отдельный слушатель на каждое поле сделать

да, в чем проблема?

похоже что у тебе в руки попал молоток и ты начал им забивать все подряд. Лучше не использовать массив потому что сложно будет масштабировать. У тебя же потом могут добавиться поля в середину, конец, начало

Вешал на них слушатель - в лог с него писались все из 4-х полей

а пример есть? можно и на каждое повесить, можно и на все сразу. Зависит от числа полей

ну и по мелочи
for (int i = 1; i < 4; i++) {

лучше for (int i = 1; i < etArray.size; i++), а еще лучше forEach цикл
Ответ написан
Комментировать
@andrej3337 Автор вопроса
Вот такой слушатель повесил для каждого поля
private void getOnFocus0() {
                etArray.get(0).setOnFocusChangeListener(new View.OnFocusChangeListener() {
                        public void onFocusChange(View v, boolean hasFocus) {
                                if (hasFocus) {
                                        EditText baseEt = (EditText) etArray.get(0);
                                        Log.e("id0", ""+baseEt);
                                }
                        }
                });
        }


При клике на поле, показывает то на которое кликнул, вывод такой
E/id0: androidx.appcompat.widget.AppCompatEditText{51f7120 VFED..CL. .F.P..ID 315,1-889,167 #7f0900e0 app:id/input1}


Как эту информацию передать в другое действие, допустим тот же exchange(), чтобы там сказать, что если вот этот app:id/input1, т.е. etArray.get(0) сработал, нужно исключить его из ArrayList - etArray.remove(0)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы