Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Как сравнить числовые данные, переданные с помощью нескольких интентов в другое активити

#java #android #activity #android_intent


Есть активити1, которое передает в активити2 для счетчика количество миллисекунд.
Количество миллисекунд может быть разным (в зависимости от того, какая кнопка нажата
на активити1).Счетчик в активити2 должен принимать эти значение миллисекунд.

В активити1 код для передачи данных такой:

 int SEKOND; 

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_dif
                SEKOND = 5000;
                Intent intent = new Intent(this,Activity2.class);
                intent.putExtra("sekondDif",SEKOND);
                startActivity(intent);
                break;
            case R.id.button_is:
                SEKOND = 50000;
                Intent intent1 = new Intent(this,Activity2.class);
                intent1.putExtra("sekondIs",SEKOND);
                startActivity(intent1);
                break;

        }
    }


В ативити2 код получения интентов такой:

Bundle extras = getIntent().getExtras();

int id0 = extras.getInt("sekondDif");
int id1 = extras.getInt("sekondIs");


Т.е. число передано и извлечено.

Далее есть счетчик, вместо id которого нужно поставить либо данные из id0 либо из
id1, в зависимости от того, какой интент был получен:

 new CountDownTimer(id, 1000) {}


Сама логика такая: на активити1 есть разные button. Если кликнуть по  button1, то
при переходе на активити2 в счетчике должно быть выставлено одно количество миллисекунд,
если кликнуть  на активтити1 по button2, то в счетчике должно быть выставлено другое
количество миллисекунд.

Помогите, пожалуйста, связать эти условия (секунды счетчика на втором активити и
выбор кнопки на первом активити ).
    


Ответы

Ответ 1



Если ваша проблема в том, что вы не знаете во второй активити какое именно значение было передано из первой, то вы можете, при вытаскивании данных из интента указывать значение по умолчанию для отсутствующих данных и проверяя ваши переменные второй активити на предмет равенства значения по умолчанию вызывать метод нужный передавая туда нужную переменную. Bundle extras = getIntent().getExtras(); //зададим -1 как значение по умолчанию. //им будет инициализированна переменная, если в Bundle нет искомого ключа. //если этот аргумент не указать и значения по ключу нет, то присвоится 0 int id0 = extras.getInt("sekondDif", -1); int id1 = extras.getInt("sekondIs", -1); if(id0 != -1) { //значит получено "sekondDif" } else if(id1 != -1) { //значит получено "sekondIs" } Также можно проверять есть ли определённый ключ в Bundle методом contains(String key)

Ответ 2



С точки зрения логики работы программы ваш подход в решении этой задачи логически неверен. В решении именно вашей задачи вообще не требуется слать какие то разные интенты и что то там потом определять какой из них какой: int second; @Override public void onClick(View v) { Intent intent = new Intent(this,Activity2.class); switch (v.getId()){ case R.id.button_dif second = 5000; break; case R.id.button_is: second = 50000; break; } intent.putExtra("sekond",second); startActivity(intent); } Activity2: Bundle extras = getIntent().getExtras(); int second = extras.getInt("second"); new CountDownTimer(second, 1000) {}; Что касается решения для вопроса в общем случае, то правильно не слать разные значения одним из интентов и потом пытаться определить, в каком же он отправлен, а одним интентом слать значение, другим - признак (ключ) о типе переданного значения: int second; final int DIF = 1; final int IS = 2; @Override public void onClick(View v) { Intent intent = new Intent(this,Activity2.class); switch (v.getId()){ case R.id.button_dif second = 5000; intent.putExtra("key",DIF); break; case R.id.button_is: second = 50000; intent.putExtra("key",IS); break; } intent.putExtra("sekond",second); startActivity(intent); } Activity2: final int DIF = 1; final int IS = 2; Bundle extras = getIntent().getExtras(); int key = extras.getInt("key"); int second = extras.getInt("second"); switch (key){ case DIF: difMethod(second); // действия при переданном значении dif break; case IS: isMethod(second); // действия при переданном значении is break; } Вы можете сделать отдельный класс констант и хранить их все там, а не инициализировать в каждом активити Замечания - по конвенции разработчика Android ЗАГЛАВНЫМИ буквами в "змеином стиле" пишутся имена констант. Имена переменных пишутся в lowerCamelCase-стиле - имя начинается с маленькой буквы, Отдельные слова в имени пишутся без пробелов с большой буквы. Этой конвенции рекомендуется придерживаться всем разработчикам.

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

Отправить комментарий