Фишки #0 - Как передавать данные между Activity и Fragment [RU, Android] / Мобильный разработчик

  Рет қаралды 20,392

Mobile Developer

Mobile Developer

5 жыл бұрын

Всем привет. С этого выпуска я начинаю новую рубрику - Фишки. В которой я буду рассказывать какие-то приемы, трюки и фишки из своего опыта. Начну с основ, а именно с передачи данных между активити и фрагментами.
Мобильный разработчик в других соц. сетях
=======================
Вконтакте - mdeveloper
Instagram - / nplau
=======================
Наши друзья и информационные партнеры:
t.me/androidev - Телеграмм канал, посвященный разработке для Андроид!
Поддержать канал рублем:
PayPal - alexgladkov@icloud.com
Mastercard - 5536 9137 9985 0652
Ставь лайк, подписывайся и пиши, чтобы ты хотел увидеть в следующих видео.

Пікірлер: 95
@vladislavbuzinsky1925
@vladislavbuzinsky1925 5 жыл бұрын
Хорошее видео, а главное практичное от того дико полезное Вставлю свои пять копеек и упомяну полезную в kotlin функцию apply, которая позволяет написать метод getInstance в одну строку fun getInstance(args: Bundle?): MainFragment = MainFragment().apply { arguments = args }
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Спасибо! ) Огромное спасибо за дополнение. Закреплю коммент
@alexandernifanin7366
@alexandernifanin7366 5 жыл бұрын
​@@MobileDeveloper Забавно, я вам пару недель давал развёрнутый комментарий по теме, где упомянул и это. Но вы не ответили, поэтому я решил вам по возможности не комментировать. :)
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Alexander Nifanin я помню, что был комментарий и не мог его найти. Прошу прощения, что не ответил, но как я объяснял в другом видео - у меня дедлайны и я в принципе ничего не делал по каналу. А потом тупо не смог коммент найти. Жаль, что так вышло, но жизнь накладывает свои правила. Дело тут не в том, что я не хотел отвечать. Наоборот ваши комментарии всегда по существу.
@alexandernifanin7366
@alexandernifanin7366 5 жыл бұрын
@@MobileDeveloper Понял. Я сначала подумал, что слишком много написал, ну и чтобы вас не демотивировать, решил удалить. Хорошо, как-нибудь ещё вам напишу. Очень приятно видеть ваши видео!
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Нет ни в коем случае это меня не демотивирует, а скорее наоборот ) я изначально хотел собрать сообщество разработчиков! Просто иногда я сразу не могу ответить на комментарий и отвечаю, когда есть время, потому что каналом я занимаюсь в свободное от работы время
@jojomajo
@jojomajo 4 жыл бұрын
по-моему данный канал бесценный кладезь информации по android + kotlin)
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Спасибо )
@Andrey-pu1lv
@Andrey-pu1lv 5 жыл бұрын
только не останавливайся с видео!)
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Не останавливаюсь )
@jenniferalderson6875
@jenniferalderson6875 5 жыл бұрын
Реально не знала, как правильно вызывать функции Activity из фрагмента, танцевала с бубнами по-всякому. Теперь буду делать это только через интерфейсы, спасибо Вам! Из пожеланий - хотелось бы увидеть на практике MVVM.
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Не за что ) Насчет MVVM это будет в контексте LiveData
@namesecondname7863
@namesecondname7863 5 жыл бұрын
Спасибо за Ваш труд! Хотелось бы увидеть от Вас видео с примером использования RxJava2 например в связке с Retrofit\Room, думаю многим было бы интересно.
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Спасибо большое за отзыв! Есть идея запилить повторение ролика про вк и показать как я живьём сейчас проект делаю.
@namesecondname7863
@namesecondname7863 5 жыл бұрын
@@MobileDeveloper Отличная идея!
@preenxus3425
@preenxus3425 5 жыл бұрын
слава богу я все делаю правильно :)
@preenxus3425
@preenxus3425 5 жыл бұрын
на вашем канале только не хватает работы с REST API, очень хотелось бы. Спасибо за ваши видео
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Этим я скоро займусь в рамках работы над Retrofit
@sergeytretyakov3040
@sergeytretyakov3040 2 жыл бұрын
А есть ли у вас видео по fragmentFactory,подскажите пожалуйста.
@OverNoobDmg
@OverNoobDmg 4 жыл бұрын
Спасибо за видео. Какой подход взаимодействия активити и фрагмента будет более предпочтительнее? через LiveData или напрямую обращаться к активити? Даже с тем же snackBar, лучше через liveData (Я оборачиваю liveData в SingleEvent) или напрямую вызвать showSnackBar?
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Лучше использовать подход SingleActivity. Но в любом случае лучше общаться через interface всегда. Мало ли вы решите завтра подменить свою активити на что-то другое
@OverNoobDmg
@OverNoobDmg 4 жыл бұрын
@@MobileDeveloper Я подразумевал, что у фрагмента есть множество событий (реализованных через SingleLiveData) и активити подписывается на них. Даже если я сменю активити на что то другое, то фрагмент об этом не узнает. Плюс такого подхода, что фрагменту не нужен объект своего родителя. Это похоже на механизм сигнал/слот из Qt
@Symbi0x7
@Symbi0x7 4 жыл бұрын
Если не ошибаюсь, чтобы не реализовывать все методы интерфейса Parcelable, можно просто указать для класса аннотацию @Parcelable.
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Сейчас да ) тогда об этом не знал ) и оно вроде в экспериментальной версии находилось )
@user-ph2sk4sp7e
@user-ph2sk4sp7e 5 жыл бұрын
А в случае применения MVP паттерна с Moxy, разве хорошее решение будет передавать данные напрямую между двумя View? Смотрел лекции, там была примерно такой способ передачи View1->Presenter1->Model->Presenter2->View2, где передача данных в Model (между двумя презентерами) может быть реализована EventBus'ами например, или рхДжавой
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Иногда надо передать данные напрямую. То есть я не вижу смысла хранить iD деталки в отдельной бд. Это избыточность ради избыточности. В 99% случаев это лишнее усложнение
@andrerussian4016
@andrerussian4016 2 жыл бұрын
по идее, через STORAGE (указазанный в примере) должны предаваться те данные, которые могут изменяться из нескольких activity\fragments в приложении (аналог store в react-е): В одном поменял - в другом отобразились изменения. Отловить ошибки труда не составляет при этом. А через putExtra передаются данные, которые не должны меняться в тех activity\fragments, куда эти данные передаются
@MobileDeveloper
@MobileDeveloper 2 жыл бұрын
Не совсем, у стора в реакте если я правильно помню подписочная модель, это довольно старое видео и там была распространена архитектура МВП, поэтому все дергалось императивно
@andrerussian4016
@andrerussian4016 2 жыл бұрын
@@MobileDeveloper Это понятно)
@Punk_Off
@Punk_Off 3 жыл бұрын
Название метода наверное перепутаны, это createNewInstance А вот брать данные через requareArguments P.S. для полноты картины не хватает реализации передачи данных между сервисом и Активити ) я только слышал что broadcastreceiver надо пробрасывать ))
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Да через broadcast receiver обычно делается ) Когда-нибудь может сделаю видео
@alekseyreyngardt3732
@alekseyreyngardt3732 5 жыл бұрын
Я не разу не встречал в коде чтобы взаимодействие между активити и фрагментом делалось как-то иначе, и уж тем более передача данных, меня сильно удивило заявление что часто встречается shared mutable state как средство передачи данных между активити.
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Сейчас такого почти не вижу а вот года 4 назад сплошь и рядом встречал.
@brenderok
@brenderok 5 жыл бұрын
А если во fragment надо передать массив с объектами из Acrivity, как стоит передавать?(Например, передать ArrayList)
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
PutParcelableArrayList вам в помощь )
@Dan_324
@Dan_324 9 ай бұрын
1 способ - 2:47 ( неправильный ) 2 способ - 7:26 ( неправильный ) 3 способ - 10:09 ( правильный )
@vr7365
@vr7365 3 жыл бұрын
Шикарное видео, но всё-же, если возможно передавать в фрагмент контекстные данные, например для recycleview(linearLayoutManager), или параметры для sharedPreference?
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Не очень понял, что вы имеете в виду?
@vr7365
@vr7365 3 жыл бұрын
@@MobileDeveloper У меня в фрагменте находится recycleview и ему нужно определить layoutmanager. А для создания объекта LinearLayoutManager нужно передать в конструктор контекст. Как это можно сделать правильно) Заранее спасибо)
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
@@vr7365 внутри фрагмента есть прямая ссылка на context. Прям так и пишете LinearLayoutManager(context, LinearLayoutManager.Vertical, false)
@vr7365
@vr7365 3 жыл бұрын
@@MobileDeveloper Всё-таки так можно, спасибо)
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
@@vr7365 пожалуйста )
@brenderok
@brenderok 5 жыл бұрын
Очень хорошее видео, спасибо. А что если у нас в проекте, к примеру, есть некоторый файл File.kt , в нём есть какая-то функция SomeFunc(), которая возвращает Массив/Строку или т.п., то как лучше передать данный Массив/Строку во фрагмент?
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Не совсем понял вопрос, но я так понял что нужно что-то передать из Активити во фрагмент ) обычно это делается через arguments. Если же вы имеете ввиду после создания фрагмента, то лучше создать отдельный интерфейс SomeProvider и приводить из фрагмента Активити к этому интерфейсу
@brenderok
@brenderok 5 жыл бұрын
@@MobileDeveloper Я имел ввиду File.kt , который не наследуется от какого-либо Activity, т.е. самый примитивный файл с одной лишь функцией внутри. Можно ли между ними передавать данные?
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Функция расширения или как? Я понять не могу ) Функции ведь не в файлах а в классах хранятся.
@alexanderfilippov3851
@alexanderfilippov3851 5 жыл бұрын
Алексей , какой по вашему наилучший способ восстановление представления фрагментов (если данные динамические) после перехода назад по бэкстеку фрагментов ?
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Очень хороший вопрос ) а вас интересует восстановление данных или отображение визуальных элементов (скролл, анимация и тд и тп?)
@alexanderfilippov3851
@alexanderfilippov3851 5 жыл бұрын
@@MobileDeveloper Отображение элементов , с данными я нашел примерный ориентир на стеке . Не знаю , насколько правильный , но когда дебажу он работает
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Я видел, что вы писали комментарий, но он пропал (
@alexanderfilippov3851
@alexanderfilippov3851 5 жыл бұрын
@@MobileDeveloper Отображение визуальных элементов интересует в первую очередь)
@sonar_devices
@sonar_devices 3 жыл бұрын
Спасибо за труд. Только не могу сконцентрироваться на коде. Вы сказали слово и совершили 10 правок + мышка летает как угорелая.
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Так как это видео его можно останавливать, замедлять, перематывать) Если я буду слишком медленно рассказывать это будет тоже тяжело )
@MRAzartx
@MRAzartx 3 жыл бұрын
Получается, что бы так же переходить из фрагмента в фрагмент, если кнопки перехода находятся в самом фрагменте, можно сделать интерфейс, закинуть его в Мэйн активити. В фрагменте сделать клик лиснер. И дальше, если нажата такая то кнопка, то из активити вызывается данный интерфейс, который реплэйсит первый фрагмент на второй?
@MRAzartx
@MRAzartx 3 жыл бұрын
Урок очень помог если честно. В частности - работа с фрагментами. Правда почему то всё таки не сработала передача данных через вызов функции getInstance в companionObject во фрагменте, но я решил это немного иначе - создаю бандл, пихаю в него данные, отправляю их в replace при замене фрагмента на иной в аргумент args, далее просто забираю во фрагменте arguments. спасибо в общем :)
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Интерфейс в активити скорее нужен для роутинга между фрагментами. Потому что только у него верхнеуровнево есть supportFragmentManager, но сейчас из-за Single Activity как правило верхнеуровневым становится fragment ) И как раз почему здесь заходит интерфейс, потому что его легко перенести к фрагменту, например )
@cardinalis6133
@cardinalis6133 5 жыл бұрын
Спасибо за видео! А как правильно передавать данные от фрагмента к фрагменту? Тоже через newInstance и bundle?
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Смотря создается ли фрагмент в этот момент или нет. Если да, то при навигации через гет инстанс передаются данные, а если нет, то можно создать интерфейс для передачи данных у активити с полями, например, куда передать и что передать. И дальше юзать этот интерфейс во всех активити. А во фрагменте приводить активити к типу этого интерфейса.
@bohdanserdyuk5959
@bohdanserdyuk5959 4 жыл бұрын
​@@MobileDeveloper Как считаешь, связка ViewModel + LiveData и прокидывание данных через неё считается имеющим право на жизнь вариантом для такой задачи?
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Прокидывать данные через вьюмодель? Лучше не надо. Есть рабочий способ через аргументы это пока самый надежный и простой способ
@it-6411
@it-6411 5 жыл бұрын
Наткнулся сегодня на Ваш канал) начало просто в шок повергло.. какие-же у нас есть криворукие коллеги.. Легче конечно пихать в хранилище, потом доставать, чем дописать implements Serializable...
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Тогда уж лучше Parcelable да?) Я бы не стал так резко отзываться о ком-либо из коллег, потому что все мы для кого-то криворукие ) Вопрос лишь в накопленном опыте.
@oleksandrhaidukov4928
@oleksandrhaidukov4928 4 жыл бұрын
Не дай боже вам в хоть каком-то рабочем проекте токен через Bundle кидать... ну что за ересь. Токен - результат аутентификации, а значит должен хранится в любом из реализующих Сессию паттернов со своими стейтамм для rèfresh или другим подходом, но не плавать как поплавок на уровне ViewController-ов... отлично обьясняешь важные темы, отчего особенно обидно видеть такие ляпы. Интент впринципе не всегда панацея, и уж темболее для потенциальных данных стейт-машины приложения.
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Опять же это был пример как передать данные ) неважно какие )
@user-qz3cl1pc8s
@user-qz3cl1pc8s 3 жыл бұрын
я видимо совсем нуб, так как не понял как потом информацию использовать во фрагменте, находится она в mainfragmente, но как её использоват? через хранилище проще - тут хоть понятно как её взять
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Через arguments
@user-qz3cl1pc8s
@user-qz3cl1pc8s 3 жыл бұрын
@@MobileDeveloper спасибо за ответ. если я правильно понял (название фрагмента).arguments (и присвоить значение чему-то) = example
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Не у аргументов можно вызывать методы которые начинаются с put (putString, putBoolean) и так далее это чтобы положить и get методы чтоб достать
@user-qz3cl1pc8s
@user-qz3cl1pc8s 3 жыл бұрын
мне нужно использовать полученное значение в if (X)
@user-qz3cl1pc8s
@user-qz3cl1pc8s 3 жыл бұрын
@@MobileDeveloper не хочу отнимать время, думаю, мне этого хватит чтобы разобраться
@memmvideos
@memmvideos 4 жыл бұрын
По моему в видео не было описано, а как правильно передавать данные из фрагмента в активити?
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Давно уже это видео снимал так что не помню. Но в любом случае это делается через приведение к интерфейсу)
@memmvideos
@memmvideos 4 жыл бұрын
@@MobileDeveloper там было про приведение активити к интерфейсу, тоже самое делается с фрагментом?
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
@@memmvideos так активити приводится к интерфейсу, чтобы его из фрагмента было дергать удобнее
@memmvideos
@memmvideos 4 жыл бұрын
@@MobileDeveloper спасибо, за оперативный ответ и впринципе за твой канал. Очень хорошие и понятные видео.
@MobileDeveloper
@MobileDeveloper 4 жыл бұрын
Пожалуйста
@developmobi3529
@developmobi3529 3 жыл бұрын
Serializable это не андроидейский! Это Джавайский!!!
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Джамайский :DD А я там сказал андроидовский?)
@developmobi3529
@developmobi3529 3 жыл бұрын
@@MobileDeveloper Вполне может быть))
@segreiulanov6057
@segreiulanov6057 5 жыл бұрын
Можно ваш github?
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Segrei Ulanov у меня битбакет и я не думаю что он будет полезен так как там все репозитории приватные )
@segreiulanov6057
@segreiulanov6057 5 жыл бұрын
@@MobileDeveloper хорошо. Спрошу тогда. Вы рассказали как правильно передавать, а как получать?))) Вот нашёл ru.stackoverflow.com/questions/613930/%D0%9A%D0%B0%D0%BA-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C-arraylist-%D1%81-activity-%D0%B2-fragment-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8F-parcelable это правильно? Мне просто нужно передать список данных, и я чета затормозил)
@MobileDeveloper
@MobileDeveloper 5 жыл бұрын
Ну у фрагмента есть arguments поле. Это обычный Bundle то есть ключ-значение. Соответственно кладёте по ключу и забираете по ключу из поля arguments. Оно доступно из любого места во фрагменте )
@sonyevans5182
@sonyevans5182 3 жыл бұрын
Извините а как передать данные из фрагмента в активити без интерфейса
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Если речь идет о передаче в другую активити, то через putExtra. А если в ту активити, в которой находится фрагмент, то пожалуй никак) либо к интерфейсу приводить, либо прям к активити (что не очень хорошо)
@sonyevans5182
@sonyevans5182 3 жыл бұрын
@@MobileDeveloper эх печально
@developer2931
@developer2931 3 жыл бұрын
13.27 вводишь людей в заблуждение. Разве помеченный сериалайзабл не-дата класс работает из коробки??? Он тоже требует допилки. Дата класс - плохой пример
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Так я тут в целом на канале этим занимаюсь ) Ввожу людей в заблуждение)
@developer2931
@developer2931 3 жыл бұрын
@@MobileDeveloper да не бро, я же не об этом. Смотрю тебя с удовольствием. Просто ты ошибся, и я решил тебя поправить. Мы же тут к знаниям стремимся?)
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Согласен. Но помеченный serializable класс работает из коробки если не содержит в себе не serializable объектов)
@user-de6dd1dd8e
@user-de6dd1dd8e 3 жыл бұрын
в этом видео нет передачи данных между двумя фрагментами
@MobileDeveloper
@MobileDeveloper 3 жыл бұрын
Разве?) я вроде об этом упоминал
@user-de6dd1dd8e
@user-de6dd1dd8e 3 жыл бұрын
@@MobileDeveloper упоминал , но не показывал ) в видео есть между двумя активити , с активити в фрагмент , с фрагмента в активити. А самое нужное и нету)
@Mecenatt
@Mecenatt 2 жыл бұрын
С активити на фрагмент не работает через аргумент .
@spornov91
@spornov91 Жыл бұрын
много слов
DO YOU HAVE FRIENDS LIKE THIS?
00:17
dednahype
Рет қаралды 52 МЛН
Survival skills: A great idea with duct tape #survival #lifehacks #camping
00:27
Did you believe it was real? #tiktok
00:25
Анастасия Тарасова
Рет қаралды 23 МЛН
Фрагменты Android
2:08:41
Surf Tech
Рет қаралды 1,8 М.
FRAGMENTS - Android Fundamentals
17:29
Philipp Lackner
Рет қаралды 324 М.
DO YOU HAVE FRIENDS LIKE THIS?
00:17
dednahype
Рет қаралды 52 МЛН