Хорошее видео, а главное практичное от того дико полезное Вставлю свои пять копеек и упомяну полезную в kotlin функцию apply, которая позволяет написать метод getInstance в одну строку fun getInstance(args: Bundle?): MainFragment = MainFragment().apply { arguments = args }
@@MobileDeveloper Забавно, я вам пару недель давал развёрнутый комментарий по теме, где упомянул и это. Но вы не ответили, поэтому я решил вам по возможности не комментировать. :)
Alexander Nifanin я помню, что был комментарий и не мог его найти. Прошу прощения, что не ответил, но как я объяснял в другом видео - у меня дедлайны и я в принципе ничего не делал по каналу. А потом тупо не смог коммент найти. Жаль, что так вышло, но жизнь накладывает свои правила. Дело тут не в том, что я не хотел отвечать. Наоборот ваши комментарии всегда по существу.
@@MobileDeveloper Понял. Я сначала подумал, что слишком много написал, ну и чтобы вас не демотивировать, решил удалить. Хорошо, как-нибудь ещё вам напишу. Очень приятно видеть ваши видео!
Нет ни в коем случае это меня не демотивирует, а скорее наоборот ) я изначально хотел собрать сообщество разработчиков! Просто иногда я сразу не могу ответить на комментарий и отвечаю, когда есть время, потому что каналом я занимаюсь в свободное от работы время
Реально не знала, как правильно вызывать функции Activity из фрагмента, танцевала с бубнами по-всякому. Теперь буду делать это только через интерфейсы, спасибо Вам! Из пожеланий - хотелось бы увидеть на практике MVVM.
Спасибо за Ваш труд! Хотелось бы увидеть от Вас видео с примером использования RxJava2 например в связке с Retrofit\Room, думаю многим было бы интересно.
по идее, через STORAGE (указазанный в примере) должны предаваться те данные, которые могут изменяться из нескольких activity\fragments в приложении (аналог store в react-е): В одном поменял - в другом отобразились изменения. Отловить ошибки труда не составляет при этом. А через putExtra передаются данные, которые не должны меняться в тех activity\fragments, куда эти данные передаются
Не совсем, у стора в реакте если я правильно помню подписочная модель, это довольно старое видео и там была распространена архитектура МВП, поэтому все дергалось императивно
Спасибо за видео. Какой подход взаимодействия активити и фрагмента будет более предпочтительнее? через LiveData или напрямую обращаться к активити? Даже с тем же snackBar, лучше через liveData (Я оборачиваю liveData в SingleEvent) или напрямую вызвать showSnackBar?
Лучше использовать подход SingleActivity. Но в любом случае лучше общаться через interface всегда. Мало ли вы решите завтра подменить свою активити на что-то другое
@@MobileDeveloper Я подразумевал, что у фрагмента есть множество событий (реализованных через SingleLiveData) и активити подписывается на них. Даже если я сменю активити на что то другое, то фрагмент об этом не узнает. Плюс такого подхода, что фрагменту не нужен объект своего родителя. Это похоже на механизм сигнал/слот из Qt
Название метода наверное перепутаны, это createNewInstance А вот брать данные через requareArguments P.S. для полноты картины не хватает реализации передачи данных между сервисом и Активити ) я только слышал что broadcastreceiver надо пробрасывать ))
Я не разу не встречал в коде чтобы взаимодействие между активити и фрагментом делалось как-то иначе, и уж тем более передача данных, меня сильно удивило заявление что часто встречается shared mutable state как средство передачи данных между активити.
А в случае применения MVP паттерна с Moxy, разве хорошее решение будет передавать данные напрямую между двумя View? Смотрел лекции, там была примерно такой способ передачи View1->Presenter1->Model->Presenter2->View2, где передача данных в Model (между двумя презентерами) может быть реализована EventBus'ами например, или рхДжавой
Иногда надо передать данные напрямую. То есть я не вижу смысла хранить iD деталки в отдельной бд. Это избыточность ради избыточности. В 99% случаев это лишнее усложнение
Получается, что бы так же переходить из фрагмента в фрагмент, если кнопки перехода находятся в самом фрагменте, можно сделать интерфейс, закинуть его в Мэйн активити. В фрагменте сделать клик лиснер. И дальше, если нажата такая то кнопка, то из активити вызывается данный интерфейс, который реплэйсит первый фрагмент на второй?
Урок очень помог если честно. В частности - работа с фрагментами. Правда почему то всё таки не сработала передача данных через вызов функции getInstance в companionObject во фрагменте, но я решил это немного иначе - создаю бандл, пихаю в него данные, отправляю их в replace при замене фрагмента на иной в аргумент args, далее просто забираю во фрагменте arguments. спасибо в общем :)
Интерфейс в активити скорее нужен для роутинга между фрагментами. Потому что только у него верхнеуровнево есть supportFragmentManager, но сейчас из-за Single Activity как правило верхнеуровневым становится fragment ) И как раз почему здесь заходит интерфейс, потому что его легко перенести к фрагменту, например )
Шикарное видео, но всё-же, если возможно передавать в фрагмент контекстные данные, например для recycleview(linearLayoutManager), или параметры для sharedPreference?
@@MobileDeveloper У меня в фрагменте находится recycleview и ему нужно определить layoutmanager. А для создания объекта LinearLayoutManager нужно передать в конструктор контекст. Как это можно сделать правильно) Заранее спасибо)
Алексей , какой по вашему наилучший способ восстановление представления фрагментов (если данные динамические) после перехода назад по бэкстеку фрагментов ?
Не дай боже вам в хоть каком-то рабочем проекте токен через Bundle кидать... ну что за ересь. Токен - результат аутентификации, а значит должен хранится в любом из реализующих Сессию паттернов со своими стейтамм для rèfresh или другим подходом, но не плавать как поплавок на уровне ViewController-ов... отлично обьясняешь важные темы, отчего особенно обидно видеть такие ляпы. Интент впринципе не всегда панацея, и уж темболее для потенциальных данных стейт-машины приложения.
Наткнулся сегодня на Ваш канал) начало просто в шок повергло.. какие-же у нас есть криворукие коллеги.. Легче конечно пихать в хранилище, потом доставать, чем дописать implements Serializable...
Тогда уж лучше Parcelable да?) Я бы не стал так резко отзываться о ком-либо из коллег, потому что все мы для кого-то криворукие ) Вопрос лишь в накопленном опыте.
Очень хорошее видео, спасибо. А что если у нас в проекте, к примеру, есть некоторый файл File.kt , в нём есть какая-то функция SomeFunc(), которая возвращает Массив/Строку или т.п., то как лучше передать данный Массив/Строку во фрагмент?
Не совсем понял вопрос, но я так понял что нужно что-то передать из Активити во фрагмент ) обычно это делается через arguments. Если же вы имеете ввиду после создания фрагмента, то лучше создать отдельный интерфейс SomeProvider и приводить из фрагмента Активити к этому интерфейсу
@@MobileDeveloper Я имел ввиду File.kt , который не наследуется от какого-либо Activity, т.е. самый примитивный файл с одной лишь функцией внутри. Можно ли между ними передавать данные?
Смотря создается ли фрагмент в этот момент или нет. Если да, то при навигации через гет инстанс передаются данные, а если нет, то можно создать интерфейс для передачи данных у активити с полями, например, куда передать и что передать. И дальше юзать этот интерфейс во всех активити. А во фрагменте приводить активити к типу этого интерфейса.
@@MobileDeveloper Как считаешь, связка ViewModel + LiveData и прокидывание данных через неё считается имеющим право на жизнь вариантом для такой задачи?
я видимо совсем нуб, так как не понял как потом информацию использовать во фрагменте, находится она в mainfragmente, но как её использоват? через хранилище проще - тут хоть понятно как её взять
13.27 вводишь людей в заблуждение. Разве помеченный сериалайзабл не-дата класс работает из коробки??? Он тоже требует допилки. Дата класс - плохой пример
@@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 это правильно? Мне просто нужно передать список данных, и я чета затормозил)
Ну у фрагмента есть arguments поле. Это обычный Bundle то есть ключ-значение. Соответственно кладёте по ключу и забираете по ключу из поля arguments. Оно доступно из любого места во фрагменте )
@@MobileDeveloper упоминал , но не показывал ) в видео есть между двумя активити , с активити в фрагмент , с фрагмента в активити. А самое нужное и нету)
Если речь идет о передаче в другую активити, то через putExtra. А если в ту активити, в которой находится фрагмент, то пожалуй никак) либо к интерфейсу приводить, либо прям к активити (что не очень хорошо)
Хорошее видео, а главное практичное от того дико полезное
Вставлю свои пять копеек и упомяну полезную в kotlin функцию apply, которая позволяет написать метод getInstance в одну строку
fun getInstance(args: Bundle?): MainFragment = MainFragment().apply { arguments = args }
Спасибо! ) Огромное спасибо за дополнение. Закреплю коммент
@@MobileDeveloper Забавно, я вам пару недель давал развёрнутый комментарий по теме, где упомянул и это. Но вы не ответили, поэтому я решил вам по возможности не комментировать. :)
Alexander Nifanin я помню, что был комментарий и не мог его найти. Прошу прощения, что не ответил, но как я объяснял в другом видео - у меня дедлайны и я в принципе ничего не делал по каналу. А потом тупо не смог коммент найти. Жаль, что так вышло, но жизнь накладывает свои правила. Дело тут не в том, что я не хотел отвечать. Наоборот ваши комментарии всегда по существу.
@@MobileDeveloper Понял. Я сначала подумал, что слишком много написал, ну и чтобы вас не демотивировать, решил удалить. Хорошо, как-нибудь ещё вам напишу. Очень приятно видеть ваши видео!
Нет ни в коем случае это меня не демотивирует, а скорее наоборот ) я изначально хотел собрать сообщество разработчиков! Просто иногда я сразу не могу ответить на комментарий и отвечаю, когда есть время, потому что каналом я занимаюсь в свободное от работы время
по-моему данный канал бесценный кладезь информации по android + kotlin)
Спасибо )
Реально не знала, как правильно вызывать функции Activity из фрагмента, танцевала с бубнами по-всякому. Теперь буду делать это только через интерфейсы, спасибо Вам!
Из пожеланий - хотелось бы увидеть на практике MVVM.
Не за что ) Насчет MVVM это будет в контексте LiveData
Спасибо за Ваш труд! Хотелось бы увидеть от Вас видео с примером использования RxJava2 например в связке с Retrofit\Room, думаю многим было бы интересно.
Спасибо большое за отзыв! Есть идея запилить повторение ролика про вк и показать как я живьём сейчас проект делаю.
@@MobileDeveloper Отличная идея!
1 способ - 2:47 ( неправильный )
2 способ - 7:26 ( неправильный )
3 способ - 10:09 ( правильный )
только не останавливайся с видео!)
Не останавливаюсь )
А есть ли у вас видео по fragmentFactory,подскажите пожалуйста.
по идее, через STORAGE (указазанный в примере) должны предаваться те данные, которые могут изменяться из нескольких activity\fragments в приложении (аналог store в react-е): В одном поменял - в другом отобразились изменения. Отловить ошибки труда не составляет при этом. А через putExtra передаются данные, которые не должны меняться в тех activity\fragments, куда эти данные передаются
Не совсем, у стора в реакте если я правильно помню подписочная модель, это довольно старое видео и там была распространена архитектура МВП, поэтому все дергалось императивно
@@MobileDeveloper Это понятно)
на вашем канале только не хватает работы с REST API, очень хотелось бы. Спасибо за ваши видео
Этим я скоро займусь в рамках работы над Retrofit
Спасибо за видео. Какой подход взаимодействия активити и фрагмента будет более предпочтительнее? через LiveData или напрямую обращаться к активити? Даже с тем же snackBar, лучше через liveData (Я оборачиваю liveData в SingleEvent) или напрямую вызвать showSnackBar?
Лучше использовать подход SingleActivity. Но в любом случае лучше общаться через interface всегда. Мало ли вы решите завтра подменить свою активити на что-то другое
@@MobileDeveloper Я подразумевал, что у фрагмента есть множество событий (реализованных через SingleLiveData) и активити подписывается на них. Даже если я сменю активити на что то другое, то фрагмент об этом не узнает. Плюс такого подхода, что фрагменту не нужен объект своего родителя. Это похоже на механизм сигнал/слот из Qt
Название метода наверное перепутаны, это createNewInstance
А вот брать данные через requareArguments
P.S. для полноты картины не хватает реализации передачи данных между сервисом и Активити ) я только слышал что broadcastreceiver надо пробрасывать ))
Да через broadcast receiver обычно делается ) Когда-нибудь может сделаю видео
15:53 именно между активити и фрагментами
Я не разу не встречал в коде чтобы взаимодействие между активити и фрагментом делалось как-то иначе, и уж тем более передача данных, меня сильно удивило заявление что часто встречается shared mutable state как средство передачи данных между активити.
Сейчас такого почти не вижу а вот года 4 назад сплошь и рядом встречал.
А в случае применения MVP паттерна с Moxy, разве хорошее решение будет передавать данные напрямую между двумя View? Смотрел лекции, там была примерно такой способ передачи View1->Presenter1->Model->Presenter2->View2, где передача данных в Model (между двумя презентерами) может быть реализована EventBus'ами например, или рхДжавой
Иногда надо передать данные напрямую. То есть я не вижу смысла хранить iD деталки в отдельной бд. Это избыточность ради избыточности. В 99% случаев это лишнее усложнение
Получается, что бы так же переходить из фрагмента в фрагмент, если кнопки перехода находятся в самом фрагменте, можно сделать интерфейс, закинуть его в Мэйн активити. В фрагменте сделать клик лиснер. И дальше, если нажата такая то кнопка, то из активити вызывается данный интерфейс, который реплэйсит первый фрагмент на второй?
Урок очень помог если честно. В частности - работа с фрагментами. Правда почему то всё таки не сработала передача данных через вызов функции getInstance в companionObject во фрагменте, но я решил это немного иначе - создаю бандл, пихаю в него данные, отправляю их в replace при замене фрагмента на иной в аргумент args, далее просто забираю во фрагменте arguments. спасибо в общем :)
Интерфейс в активити скорее нужен для роутинга между фрагментами. Потому что только у него верхнеуровнево есть supportFragmentManager, но сейчас из-за Single Activity как правило верхнеуровневым становится fragment ) И как раз почему здесь заходит интерфейс, потому что его легко перенести к фрагменту, например )
Шикарное видео, но всё-же, если возможно передавать в фрагмент контекстные данные, например для recycleview(linearLayoutManager), или параметры для sharedPreference?
Не очень понял, что вы имеете в виду?
@@MobileDeveloper У меня в фрагменте находится recycleview и ему нужно определить layoutmanager. А для создания объекта LinearLayoutManager нужно передать в конструктор контекст. Как это можно сделать правильно) Заранее спасибо)
@@vr7365 внутри фрагмента есть прямая ссылка на context. Прям так и пишете LinearLayoutManager(context, LinearLayoutManager.Vertical, false)
@@MobileDeveloper Всё-таки так можно, спасибо)
@@vr7365 пожалуйста )
Алексей , какой по вашему наилучший способ восстановление представления фрагментов (если данные динамические) после перехода назад по бэкстеку фрагментов ?
Очень хороший вопрос ) а вас интересует восстановление данных или отображение визуальных элементов (скролл, анимация и тд и тп?)
@@MobileDeveloper Отображение элементов , с данными я нашел примерный ориентир на стеке . Не знаю , насколько правильный , но когда дебажу он работает
Я видел, что вы писали комментарий, но он пропал (
@@MobileDeveloper Отображение визуальных элементов интересует в первую очередь)
Не дай боже вам в хоть каком-то рабочем проекте токен через Bundle кидать... ну что за ересь. Токен - результат аутентификации, а значит должен хранится в любом из реализующих Сессию паттернов со своими стейтамм для rèfresh или другим подходом, но не плавать как поплавок на уровне ViewController-ов... отлично обьясняешь важные темы, отчего особенно обидно видеть такие ляпы. Интент впринципе не всегда панацея, и уж темболее для потенциальных данных стейт-машины приложения.
Опять же это был пример как передать данные ) неважно какие )
слава богу я все делаю правильно :)
Спасибо за труд. Только не могу сконцентрироваться на коде. Вы сказали слово и совершили 10 правок + мышка летает как угорелая.
Так как это видео его можно останавливать, замедлять, перематывать) Если я буду слишком медленно рассказывать это будет тоже тяжело )
Наткнулся сегодня на Ваш канал) начало просто в шок повергло.. какие-же у нас есть криворукие коллеги.. Легче конечно пихать в хранилище, потом доставать, чем дописать implements Serializable...
Тогда уж лучше Parcelable да?) Я бы не стал так резко отзываться о ком-либо из коллег, потому что все мы для кого-то криворукие ) Вопрос лишь в накопленном опыте.
Очень хорошее видео, спасибо. А что если у нас в проекте, к примеру, есть некоторый файл File.kt , в нём есть какая-то функция SomeFunc(), которая возвращает Массив/Строку или т.п., то как лучше передать данный Массив/Строку во фрагмент?
Не совсем понял вопрос, но я так понял что нужно что-то передать из Активити во фрагмент ) обычно это делается через arguments. Если же вы имеете ввиду после создания фрагмента, то лучше создать отдельный интерфейс SomeProvider и приводить из фрагмента Активити к этому интерфейсу
@@MobileDeveloper Я имел ввиду File.kt , который не наследуется от какого-либо Activity, т.е. самый примитивный файл с одной лишь функцией внутри. Можно ли между ними передавать данные?
Функция расширения или как? Я понять не могу ) Функции ведь не в файлах а в классах хранятся.
А если во fragment надо передать массив с объектами из Acrivity, как стоит передавать?(Например, передать ArrayList)
PutParcelableArrayList вам в помощь )
Спасибо за видео! А как правильно передавать данные от фрагмента к фрагменту? Тоже через newInstance и bundle?
Смотря создается ли фрагмент в этот момент или нет. Если да, то при навигации через гет инстанс передаются данные, а если нет, то можно создать интерфейс для передачи данных у активити с полями, например, куда передать и что передать. И дальше юзать этот интерфейс во всех активити. А во фрагменте приводить активити к типу этого интерфейса.
@@MobileDeveloper Как считаешь, связка ViewModel + LiveData и прокидывание данных через неё считается имеющим право на жизнь вариантом для такой задачи?
Прокидывать данные через вьюмодель? Лучше не надо. Есть рабочий способ через аргументы это пока самый надежный и простой способ
я видимо совсем нуб, так как не понял как потом информацию использовать во фрагменте, находится она в mainfragmente, но как её использоват? через хранилище проще - тут хоть понятно как её взять
Через arguments
@@MobileDeveloper спасибо за ответ. если я правильно понял (название фрагмента).arguments (и присвоить значение чему-то) = example
Не у аргументов можно вызывать методы которые начинаются с put (putString, putBoolean) и так далее это чтобы положить и get методы чтоб достать
мне нужно использовать полученное значение в if (X)
@@MobileDeveloper не хочу отнимать время, думаю, мне этого хватит чтобы разобраться
По моему в видео не было описано, а как правильно передавать данные из фрагмента в активити?
Давно уже это видео снимал так что не помню. Но в любом случае это делается через приведение к интерфейсу)
@@MobileDeveloper там было про приведение активити к интерфейсу, тоже самое делается с фрагментом?
@@memmvideos так активити приводится к интерфейсу, чтобы его из фрагмента было дергать удобнее
@@MobileDeveloper спасибо, за оперативный ответ и впринципе за твой канал. Очень хорошие и понятные видео.
Пожалуйста
Serializable это не андроидейский! Это Джавайский!!!
Джамайский :DD А я там сказал андроидовский?)
@@MobileDeveloper Вполне может быть))
13.27 вводишь людей в заблуждение. Разве помеченный сериалайзабл не-дата класс работает из коробки??? Он тоже требует допилки. Дата класс - плохой пример
Так я тут в целом на канале этим занимаюсь ) Ввожу людей в заблуждение)
@@MobileDeveloper да не бро, я же не об этом. Смотрю тебя с удовольствием. Просто ты ошибся, и я решил тебя поправить. Мы же тут к знаниям стремимся?)
Согласен. Но помеченный serializable класс работает из коробки если не содержит в себе не serializable объектов)
Можно ваш github?
Segrei Ulanov у меня битбакет и я не думаю что он будет полезен так как там все репозитории приватные )
@@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 это правильно? Мне просто нужно передать список данных, и я чета затормозил)
Ну у фрагмента есть arguments поле. Это обычный Bundle то есть ключ-значение. Соответственно кладёте по ключу и забираете по ключу из поля arguments. Оно доступно из любого места во фрагменте )
в этом видео нет передачи данных между двумя фрагментами
Разве?) я вроде об этом упоминал
@@MobileDeveloper упоминал , но не показывал ) в видео есть между двумя активити , с активити в фрагмент , с фрагмента в активити. А самое нужное и нету)
С активити на фрагмент не работает через аргумент .
Извините а как передать данные из фрагмента в активити без интерфейса
Если речь идет о передаче в другую активити, то через putExtra. А если в ту активити, в которой находится фрагмент, то пожалуй никак) либо к интерфейсу приводить, либо прям к активити (что не очень хорошо)
@@MobileDeveloper эх печально
Слишком много воды
много слов
Если не ошибаюсь, чтобы не реализовывать все методы интерфейса Parcelable, можно просто указать для класса аннотацию @Parcelable.
Сейчас да ) тогда об этом не знал ) и оно вроде в экспериментальной версии находилось )