Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 2

Передача значений между активностями

20.02.2017, 17:24. Показов 3036. Ответов 34

Студворк — интернет-сервис помощи студентам
Добрый день. Как можно передавать значения переменных между активностями? У меня задача такая: имею четыре активности, одна это заголовок, вторая и третья имеют по два радиобаттона , нажатия на которых прибавляют значения к переменым(а и b). А на четвертой выводятся переменные(a,b), и их значения(то есть сколько нажали первый радиобаттон и сколько нажали второй).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2017, 17:24
Ответы с готовыми решениями:

Передача данных между активностями
к примеру есть 2 активности первая public class first_act extends Activity { @Override protected void onCreate(Bundle...

Переход между активностями!
не могу перейти между активностями! вот весь лог 12-27 14:32:51.611: D/dalvikvm(330): GC_EXTERNAL_ALLOC freed 83K, 51% free...

Затруднение с переключением между активностями
Чтобы лучше понимать решил написать приложение расписания пар в университете и наткнулся на одну проблему. Создал одну активность в которой...

34
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 15:48
Студворк — интернет-сервис помощи студентам
Снова споры о высших материях, смысл того, что вместе с extra я предложил sharedPref просто потому, что для ТС разницы никакой, а вот ошибку при нажатии назад на какой-нибудь 3-4й активити словит точно.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
21.02.2017, 16:45
ExFau$t, позвольте с вами не согласиться, коллега) статика хотя бы дает проверку имени и типа, а засовывание в sharedPref кроме гемороя с самим засовыванием/высовыванием дает возможность налететь на лишнюю букву в имени записанном в виде строки или несоответствие содержимого. в sharedPref надо класть если нужно обеспечить сохраняемость между запусками. в остальных случаях это ад адский, но вы его предлагали как один из вариантов костылей, поэтому претензий не имею, да, логически - это один из вариантов.

Добавлено через 2 минуты
..хотя может быть я просто не знаю молниеносных и безопасных способов трансформации произвольного объекта в экстру или не сильно от нее в плане разработки отличающийся преф
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 16:54
vxg, не пользуюсь статиками, вот и не предлагаю, коллега). Да ошибка в имени переменной может случиться с такой же вероятностью, как и полях SharedPref. Хотя, действительно, это тоже один из вариантов.

Добавлено через 4 минуты
Ну не знаю, на вкус и цвет.. Но лично мне SharedPref очень нравится не только в плане хранения каких-то настроек, но ещё как мини-бд, в некоторых случаях даже логгер, невероятно удобная штука.
1
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.02.2017, 16:55
я уже раз 5 точно писал что практически что угодно можно передавать как строку
кладем
Java
1
2
        Intent intent = new Intent();
        intent.putExtra("param1", new Gson().toJson(some_class_object));
достаем
Java
1
SomeClass object = new Gson().fromJson(intent.getStringExtra("param1"), SomeClass.class);
2
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
21.02.2017, 17:21
Паблито, у меня это до сих пор перед глазами - это реально мощно хоть я ни разу и не делал так, но все равно остаётся проблема ошибки в имени и типе. Да и просто стремно туда сюда переливать то что уже у тебя есть
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
22.02.2017, 10:25
Паблито, может быть проблема при декодировании сложных типов. Также при преобразовании вещественных в целые, в этом случае приходится писать обработчики.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.02.2017, 11:34
пример класса в студию, а я покажу как это сделать

и я повторю очевидное - если возникает необходимость передавать сложные структуры (объекты) между активностями, значит что-то хромает в архитектуре
активити, по идее, это малосвязанные или вообще не связанные между собой компоненты
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
22.02.2017, 11:47
Цитата Сообщение от Паблито Посмотреть сообщение
пример класса в студию, а я покажу как это сделать
Да не, я уже делал, у людей на SO такая проблема встречалась, так что не стану.
Цитата Сообщение от Паблито Посмотреть сообщение
если возникает необходимость передавать сложные структуры (объекты) между активностями, значит что-то хромает в архитектуре
Я использую обычно фрагменты, но перейду на активности. Допустим, есть регистрация заказа в несколько шагов. Эти данные передаются между фрагментами или активностями (не важно) через Bundle. Данные достаточно объёмные могут быть. Никакой ошибки в архитектуре не вижу.
Кроме того, хотел сказать, что SharedPreferences не есть противник Intent, их можно использовать одновременно как раз для случая выхода из программы или неожиданного перехода с активности 3 на активность 2.
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
22.02.2017, 15:59
Раз холивар, то выскажу свое ИМХО.
ExFau$t, есть отличная либа Hawk для упрощения работы с запись\восстановлением объектов в SharedPreferences. Юзается в паре проектов, отлично себя показывает. Может вам пригодится. Но я все же придерживаюсь мнения, что для передачи объектов между View SharedPreferences излишни.
vxg, чтоб избежать ошибки в имени и типе, создание bundle должно происходить там, где он используется. И объекту можно дать интерфейс Serializable и без проблем передавать через Intent.
По поводу потери типа или ключа: только View должна знать какие ей параметры нужны. Поэтому создание intent+bundle, fragment+bundle, view+bundle должно происходить в самой View в статик методе. Пример этому то, как AS создает getInstance для фрагментов. И использование констант вместо magic string|numbers. Тогда всегда видно какой тип передан и какой ключ. И не приходится искать по всем другим классам, где же был создан этот bundle.
CoolMind, согласен с Паблито, если между View передаются сложные объекты - это не правильно. Должны передаваться идентификаторы, а сами объекты должна хранится в каком нибудь хранилище (просто в кеше, в SharedPreferences, DB, etc). И по идентификатору извлекаться из него. Соответственно они там будут в единичном экземпляре и всегда актуальны, если правильно все сделано.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
22.02.2017, 16:26
demixdn, у меня нет проблем с SharedPref, спасибо за заботу. Я не передаю объекты "между View". Да и связывать активити редко приходится, просто нет в этом необходимости.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
22.02.2017, 16:35
demixdn, бинго - они должны хранится в хранилище и извлекаться по идентификатору - просто представьте статик объект в виде умного хранилища)
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
22.02.2017, 17:12
vxg, не обязательно он статик. это зависит от подхода. да, скорей всего он будет существать в одном экземпляре. Может это будет синглетон, а может его кто-то будет инжектить с помощью DI. И совсем не обязательно что это хранилище для всего. Всегда можно что-то декомпозировать и разбить на более мелкие независимые части.
И уровень хранения тоже вполне зависит от задач. Либо этот кеш есть в презентере, либо он есть в репозитории, либо просто класс MemoryCache для своих репозитариев, либо вообще отдать на откуп какой-нибудь либе типа Store (но еще не находилось случая, чтоб пришлось использовать столь наворочанную либу).
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.02.2017, 19:48
Цитата Сообщение от demixdn Посмотреть сообщение
если между View передаются сложные объекты - это не правильно
Совершенно не согласен. Во-первых, зачем тогда вообще Intent, Bundle, давайте всё делать через SharedPreferences, там же и будем отслеживать актуальность переданных данных (и не дай бог, где-то что-то перезапишется, пока вы что-то передаёте через SP).
Во-вторых, при пересоздании активности (фрагмента) надо уметь восстанавливать данные, которые хранятся в Bundle. Опять пойдём в SP?
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
27.02.2017, 14:01
CoolMind, bundle используется только для передачи идентификатора или пути на что-то (файл, url). Объекты хранить в другом хранилище, отвязанном от жизненного цикла activity|fragment.
Пересоздание - это вообще отдельная тема. Все хорошо, если у вас поток один и у вас все поля инициализируются и заполняются в onCreate, что что если какие то данные асинхронные и прилетают после onResume. После переворота старые данные в onCreate в полях записались, после в onRestoreInstanceState перезаписались на новые (но не сохраненные). Но исходный bundle содержит старые данные. И в соответствии с ними какой нибудь поток вернет данные и перезапишет их снова, поверх измененных. И поэтому приходится выкручиваться, записывать руками в Bundle savedInstanceState свои данные, чтоб уже в оnCreate у нас были актуальные данные. Да, случай частный. Но я часто видел, что некоторые данные в поля пишутся в onResume, что опять же ставит ту же проблему, руками прописывать свой bundle.
Вот это все нужно держать в голове и помнить о таких моментах. Вместо того чтоб юзать идентификаторы и в onPause вызывать функцию saveMyObject.
В любом случае, мне так удобней. Если вам удобней в bundle все совать, ну ладно. Главное, чтоб все работало и тестировалось.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
27.02.2017, 16:17
demixdn, возможно, мы друг друга не так поняли. Я в целом с вами согласен, всё это очень интересно, но имел в виду, что я передаю в Bundle сложный класс, состоящий из множества других классов, может быть. Он Serializable, не содержит внутри себя Bitmap, файлов или каких-то затратных по памяти объектов. Просто сам по себе сложный. В этом случае SP тоже не выручает, если мы передаём данные через JSON. Т.е. по сути, JSON с классом что в Bundle, что в SharedPreferences одинаков.
Выше Паблито писал про
intent.putExtra,
new Gson().fromJson(intent.getStringExtra.
Это же самое я могу сделать и в SharedPreferences. Возможно, вас смутила фраза:
Цитата Сообщение от CoolMind Посмотреть сообщение
Данные достаточно объёмные могут быть.
Да, я малость неправильно выразился. Конечно, никаких Bitmap, ресурсов не передаю через Bundle. Просто достаточно сложный класс. И в этом случае возникает проблема декодирования JSON (и это уже не зависит от SP, Bundle).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2017, 16:17

Кто как передаёт коллекции между активностями, классами?
Всем привет! Поделитесь опытом. Допустим, в одном классе вы накапливаете данные (ArrayList), в другой передаёте. Там можете вывести в...

MediaPlayer, рывок перезапуска музыки при переходе между активностями
Всем привет, есть приложение с несколькими активностями и при переходе между ними заметен рывок перезапуска музыки (onResume). Как сделать...

Передача значений между Activity
Есть 2 Activity, Main и Two. В Main - TextView. в Two - Button и Edittext (Decimal) Как мне передать с Two в Main значение указное в...

Передача значений между классами
Как передать значение int-овой переменной из одного класса в другой? Всё было бы просто если оба класса были унаследованы от Activity....

Передача объектов между активностями
У меня есть сущность Test и мне необходимо передать объект этой сущности в другую активность, как это сделать? Я заметил что есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru