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

Поділитися
Вставка
  • Опубліковано 19 лис 2024

КОМЕНТАРІ • 97

  • @vladislavbuzinsky1925
    @vladislavbuzinsky1925 6 років тому +12

    Хорошее видео, а главное практичное от того дико полезное
    Вставлю свои пять копеек и упомяну полезную в kotlin функцию apply, которая позволяет написать метод getInstance в одну строку
    fun getInstance(args: Bundle?): MainFragment = MainFragment().apply { arguments = args }

    • @MobileDeveloper
      @MobileDeveloper  6 років тому

      Спасибо! ) Огромное спасибо за дополнение. Закреплю коммент

    • @alexandernifanin7366
      @alexandernifanin7366 6 років тому

      ​@@MobileDeveloper Забавно, я вам пару недель давал развёрнутый комментарий по теме, где упомянул и это. Но вы не ответили, поэтому я решил вам по возможности не комментировать. :)

    • @MobileDeveloper
      @MobileDeveloper  6 років тому

      Alexander Nifanin я помню, что был комментарий и не мог его найти. Прошу прощения, что не ответил, но как я объяснял в другом видео - у меня дедлайны и я в принципе ничего не делал по каналу. А потом тупо не смог коммент найти. Жаль, что так вышло, но жизнь накладывает свои правила. Дело тут не в том, что я не хотел отвечать. Наоборот ваши комментарии всегда по существу.

    • @alexandernifanin7366
      @alexandernifanin7366 6 років тому +1

      @@MobileDeveloper Понял. Я сначала подумал, что слишком много написал, ну и чтобы вас не демотивировать, решил удалить. Хорошо, как-нибудь ещё вам напишу. Очень приятно видеть ваши видео!

    • @MobileDeveloper
      @MobileDeveloper  6 років тому +2

      Нет ни в коем случае это меня не демотивирует, а скорее наоборот ) я изначально хотел собрать сообщество разработчиков! Просто иногда я сразу не могу ответить на комментарий и отвечаю, когда есть время, потому что каналом я занимаюсь в свободное от работы время

  • @jojomajo
    @jojomajo 4 роки тому +11

    по-моему данный канал бесценный кладезь информации по android + kotlin)

  • @ianagamurar
    @ianagamurar 5 років тому +1

    Реально не знала, как правильно вызывать функции Activity из фрагмента, танцевала с бубнами по-всякому. Теперь буду делать это только через интерфейсы, спасибо Вам!
    Из пожеланий - хотелось бы увидеть на практике MVVM.

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Не за что ) Насчет MVVM это будет в контексте LiveData

  • @namesecondname7863
    @namesecondname7863 6 років тому +5

    Спасибо за Ваш труд! Хотелось бы увидеть от Вас видео с примером использования RxJava2 например в связке с Retrofit\Room, думаю многим было бы интересно.

    • @MobileDeveloper
      @MobileDeveloper  6 років тому +3

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

    • @namesecondname7863
      @namesecondname7863 6 років тому

      @@MobileDeveloper Отличная идея!

  • @Dan_324
    @Dan_324 Рік тому +2

    1 способ - 2:47 ( неправильный )
    2 способ - 7:26 ( неправильный )
    3 способ - 10:09 ( правильный )

  • @Andrey-pu1lv
    @Andrey-pu1lv 5 років тому

    только не останавливайся с видео!)

  • @sergeytretyakov3040
    @sergeytretyakov3040 3 роки тому

    А есть ли у вас видео по fragmentFactory,подскажите пожалуйста.

  • @andrerussian4016
    @andrerussian4016 2 роки тому

    по идее, через STORAGE (указазанный в примере) должны предаваться те данные, которые могут изменяться из нескольких activity\fragments в приложении (аналог store в react-е): В одном поменял - в другом отобразились изменения. Отловить ошибки труда не составляет при этом. А через putExtra передаются данные, которые не должны меняться в тех activity\fragments, куда эти данные передаются

    • @MobileDeveloper
      @MobileDeveloper  2 роки тому

      Не совсем, у стора в реакте если я правильно помню подписочная модель, это довольно старое видео и там была распространена архитектура МВП, поэтому все дергалось императивно

    • @andrerussian4016
      @andrerussian4016 2 роки тому

      @@MobileDeveloper Это понятно)

  • @preenxus3425
    @preenxus3425 5 років тому +1

    на вашем канале только не хватает работы с REST API, очень хотелось бы. Спасибо за ваши видео

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Этим я скоро займусь в рамках работы над Retrofit

  • @OverNoobDmg
    @OverNoobDmg 5 років тому +1

    Спасибо за видео. Какой подход взаимодействия активити и фрагмента будет более предпочтительнее? через LiveData или напрямую обращаться к активити? Даже с тем же snackBar, лучше через liveData (Я оборачиваю liveData в SingleEvent) или напрямую вызвать showSnackBar?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Лучше использовать подход SingleActivity. Но в любом случае лучше общаться через interface всегда. Мало ли вы решите завтра подменить свою активити на что-то другое

    • @OverNoobDmg
      @OverNoobDmg 5 років тому +1

      @@MobileDeveloper Я подразумевал, что у фрагмента есть множество событий (реализованных через SingleLiveData) и активити подписывается на них. Даже если я сменю активити на что то другое, то фрагмент об этом не узнает. Плюс такого подхода, что фрагменту не нужен объект своего родителя. Это похоже на механизм сигнал/слот из Qt

  • @Punk_Off
    @Punk_Off 4 роки тому +1

    Название метода наверное перепутаны, это createNewInstance
    А вот брать данные через requareArguments
    P.S. для полноты картины не хватает реализации передачи данных между сервисом и Активити ) я только слышал что broadcastreceiver надо пробрасывать ))

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Да через broadcast receiver обычно делается ) Когда-нибудь может сделаю видео

  • @usertyfoon
    @usertyfoon Місяць тому

    15:53 именно между активити и фрагментами

  • @alekseyreyngardt3732
    @alekseyreyngardt3732 6 років тому +1

    Я не разу не встречал в коде чтобы взаимодействие между активити и фрагментом делалось как-то иначе, и уж тем более передача данных, меня сильно удивило заявление что часто встречается shared mutable state как средство передачи данных между активити.

    • @MobileDeveloper
      @MobileDeveloper  6 років тому

      Сейчас такого почти не вижу а вот года 4 назад сплошь и рядом встречал.

  • @ИльяИванов-л1ъ6н
    @ИльяИванов-л1ъ6н 5 років тому

    А в случае применения MVP паттерна с Moxy, разве хорошее решение будет передавать данные напрямую между двумя View? Смотрел лекции, там была примерно такой способ передачи View1->Presenter1->Model->Presenter2->View2, где передача данных в Model (между двумя презентерами) может быть реализована EventBus'ами например, или рхДжавой

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      Иногда надо передать данные напрямую. То есть я не вижу смысла хранить iD деталки в отдельной бд. Это избыточность ради избыточности. В 99% случаев это лишнее усложнение

  • @MRAzartx
    @MRAzartx 3 роки тому

    Получается, что бы так же переходить из фрагмента в фрагмент, если кнопки перехода находятся в самом фрагменте, можно сделать интерфейс, закинуть его в Мэйн активити. В фрагменте сделать клик лиснер. И дальше, если нажата такая то кнопка, то из активити вызывается данный интерфейс, который реплэйсит первый фрагмент на второй?

    • @MRAzartx
      @MRAzartx 3 роки тому

      Урок очень помог если честно. В частности - работа с фрагментами. Правда почему то всё таки не сработала передача данных через вызов функции getInstance в companionObject во фрагменте, но я решил это немного иначе - создаю бандл, пихаю в него данные, отправляю их в replace при замене фрагмента на иной в аргумент args, далее просто забираю во фрагменте arguments. спасибо в общем :)

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

      Интерфейс в активити скорее нужен для роутинга между фрагментами. Потому что только у него верхнеуровнево есть supportFragmentManager, но сейчас из-за Single Activity как правило верхнеуровневым становится fragment ) И как раз почему здесь заходит интерфейс, потому что его легко перенести к фрагменту, например )

  • @vr7365
    @vr7365 3 роки тому

    Шикарное видео, но всё-же, если возможно передавать в фрагмент контекстные данные, например для recycleview(linearLayoutManager), или параметры для sharedPreference?

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

      Не очень понял, что вы имеете в виду?

    • @vr7365
      @vr7365 3 роки тому

      @@MobileDeveloper У меня в фрагменте находится recycleview и ему нужно определить layoutmanager. А для создания объекта LinearLayoutManager нужно передать в конструктор контекст. Как это можно сделать правильно) Заранее спасибо)

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому +1

      @@vr7365 внутри фрагмента есть прямая ссылка на context. Прям так и пишете LinearLayoutManager(context, LinearLayoutManager.Vertical, false)

    • @vr7365
      @vr7365 3 роки тому

      @@MobileDeveloper Всё-таки так можно, спасибо)

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

      @@vr7365 пожалуйста )

  • @alexanderfilippov3851
    @alexanderfilippov3851 5 років тому

    Алексей , какой по вашему наилучший способ восстановление представления фрагментов (если данные динамические) после перехода назад по бэкстеку фрагментов ?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      Очень хороший вопрос ) а вас интересует восстановление данных или отображение визуальных элементов (скролл, анимация и тд и тп?)

    • @alexanderfilippov3851
      @alexanderfilippov3851 5 років тому

      @@MobileDeveloper Отображение элементов , с данными я нашел примерный ориентир на стеке . Не знаю , насколько правильный , но когда дебажу он работает

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Я видел, что вы писали комментарий, но он пропал (

    • @alexanderfilippov3851
      @alexanderfilippov3851 5 років тому

      @@MobileDeveloper Отображение визуальных элементов интересует в первую очередь)

  • @oleksandrhaidukov4928
    @oleksandrhaidukov4928 5 років тому +1

    Не дай боже вам в хоть каком-то рабочем проекте токен через Bundle кидать... ну что за ересь. Токен - результат аутентификации, а значит должен хранится в любом из реализующих Сессию паттернов со своими стейтамм для rèfresh или другим подходом, но не плавать как поплавок на уровне ViewController-ов... отлично обьясняешь важные темы, отчего особенно обидно видеть такие ляпы. Интент впринципе не всегда панацея, и уж темболее для потенциальных данных стейт-машины приложения.

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      Опять же это был пример как передать данные ) неважно какие )

  • @preenxus3425
    @preenxus3425 5 років тому

    слава богу я все делаю правильно :)

  • @sonar_devices
    @sonar_devices 4 роки тому

    Спасибо за труд. Только не могу сконцентрироваться на коде. Вы сказали слово и совершили 10 правок + мышка летает как угорелая.

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Так как это видео его можно останавливать, замедлять, перематывать) Если я буду слишком медленно рассказывать это будет тоже тяжело )

  • @it-6411
    @it-6411 5 років тому

    Наткнулся сегодня на Ваш канал) начало просто в шок повергло.. какие-же у нас есть криворукие коллеги.. Легче конечно пихать в хранилище, потом доставать, чем дописать implements Serializable...

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +3

      Тогда уж лучше Parcelable да?) Я бы не стал так резко отзываться о ком-либо из коллег, потому что все мы для кого-то криворукие ) Вопрос лишь в накопленном опыте.

  • @brenderok
    @brenderok 5 років тому

    Очень хорошее видео, спасибо. А что если у нас в проекте, к примеру, есть некоторый файл File.kt , в нём есть какая-то функция SomeFunc(), которая возвращает Массив/Строку или т.п., то как лучше передать данный Массив/Строку во фрагмент?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Не совсем понял вопрос, но я так понял что нужно что-то передать из Активити во фрагмент ) обычно это делается через arguments. Если же вы имеете ввиду после создания фрагмента, то лучше создать отдельный интерфейс SomeProvider и приводить из фрагмента Активити к этому интерфейсу

    • @brenderok
      @brenderok 5 років тому

      @@MobileDeveloper Я имел ввиду File.kt , который не наследуется от какого-либо Activity, т.е. самый примитивный файл с одной лишь функцией внутри. Можно ли между ними передавать данные?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      Функция расширения или как? Я понять не могу ) Функции ведь не в файлах а в классах хранятся.

  • @brenderok
    @brenderok 5 років тому

    А если во fragment надо передать массив с объектами из Acrivity, как стоит передавать?(Например, передать ArrayList)

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      PutParcelableArrayList вам в помощь )

  • @cardinalis6133
    @cardinalis6133 5 років тому

    Спасибо за видео! А как правильно передавать данные от фрагмента к фрагменту? Тоже через newInstance и bundle?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому +1

      Смотря создается ли фрагмент в этот момент или нет. Если да, то при навигации через гет инстанс передаются данные, а если нет, то можно создать интерфейс для передачи данных у активити с полями, например, куда передать и что передать. И дальше юзать этот интерфейс во всех активити. А во фрагменте приводить активити к типу этого интерфейса.

    • @bohdanserdyuk5959
      @bohdanserdyuk5959 4 роки тому

      ​@@MobileDeveloper Как считаешь, связка ViewModel + LiveData и прокидывание данных через неё считается имеющим право на жизнь вариантом для такой задачи?

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Прокидывать данные через вьюмодель? Лучше не надо. Есть рабочий способ через аргументы это пока самый надежный и простой способ

  • @МихаилСолодов-в9щ
    @МихаилСолодов-в9щ 4 роки тому

    я видимо совсем нуб, так как не понял как потом информацию использовать во фрагменте, находится она в mainfragmente, но как её использоват? через хранилище проще - тут хоть понятно как её взять

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Через arguments

    • @МихаилСолодов-в9щ
      @МихаилСолодов-в9щ 4 роки тому

      @@MobileDeveloper спасибо за ответ. если я правильно понял (название фрагмента).arguments (и присвоить значение чему-то) = example

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Не у аргументов можно вызывать методы которые начинаются с put (putString, putBoolean) и так далее это чтобы положить и get методы чтоб достать

    • @МихаилСолодов-в9щ
      @МихаилСолодов-в9щ 4 роки тому

      мне нужно использовать полученное значение в if (X)

    • @МихаилСолодов-в9щ
      @МихаилСолодов-в9щ 4 роки тому

      @@MobileDeveloper не хочу отнимать время, думаю, мне этого хватит чтобы разобраться

  • @memmvideos
    @memmvideos 5 років тому

    По моему в видео не было описано, а как правильно передавать данные из фрагмента в активити?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Давно уже это видео снимал так что не помню. Но в любом случае это делается через приведение к интерфейсу)

    • @memmvideos
      @memmvideos 5 років тому

      @@MobileDeveloper там было про приведение активити к интерфейсу, тоже самое делается с фрагментом?

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      @@memmvideos так активити приводится к интерфейсу, чтобы его из фрагмента было дергать удобнее

    • @memmvideos
      @memmvideos 5 років тому

      @@MobileDeveloper спасибо, за оперативный ответ и впринципе за твой канал. Очень хорошие и понятные видео.

    • @MobileDeveloper
      @MobileDeveloper  5 років тому

      Пожалуйста

  • @developmobi3529
    @developmobi3529 4 роки тому

    Serializable это не андроидейский! Это Джавайский!!!

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Джамайский :DD А я там сказал андроидовский?)

    • @developmobi3529
      @developmobi3529 4 роки тому

      @@MobileDeveloper Вполне может быть))

  • @developer2931
    @developer2931 4 роки тому

    13.27 вводишь людей в заблуждение. Разве помеченный сериалайзабл не-дата класс работает из коробки??? Он тоже требует допилки. Дата класс - плохой пример

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Так я тут в целом на канале этим занимаюсь ) Ввожу людей в заблуждение)

    • @developer2931
      @developer2931 4 роки тому

      @@MobileDeveloper да не бро, я же не об этом. Смотрю тебя с удовольствием. Просто ты ошибся, и я решил тебя поправить. Мы же тут к знаниям стремимся?)

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому +1

      Согласен. Но помеченный serializable класс работает из коробки если не содержит в себе не serializable объектов)

  • @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. Оно доступно из любого места во фрагменте )

  • @ЮрійБережний-с7ъ
    @ЮрійБережний-с7ъ 3 роки тому

    в этом видео нет передачи данных между двумя фрагментами

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

      Разве?) я вроде об этом упоминал

    • @ЮрійБережний-с7ъ
      @ЮрійБережний-с7ъ 3 роки тому

      @@MobileDeveloper упоминал , но не показывал ) в видео есть между двумя активити , с активити в фрагмент , с фрагмента в активити. А самое нужное и нету)

    • @Mecenatt
      @Mecenatt 2 роки тому

      С активити на фрагмент не работает через аргумент .

  • @sonyevans5182
    @sonyevans5182 4 роки тому

    Извините а как передать данные из фрагмента в активити без интерфейса

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Если речь идет о передаче в другую активити, то через putExtra. А если в ту активити, в которой находится фрагмент, то пожалуй никак) либо к интерфейсу приводить, либо прям к активити (что не очень хорошо)

    • @sonyevans5182
      @sonyevans5182 4 роки тому

      @@MobileDeveloper эх печально

  • @Logorigm
    @Logorigm 4 місяці тому

    Слишком много воды

  • @spornov91
    @spornov91 2 роки тому

    много слов

  • @Symbi0x7
    @Symbi0x7 4 роки тому

    Если не ошибаюсь, чтобы не реализовывать все методы интерфейса Parcelable, можно просто указать для класса аннотацию @Parcelable.

    • @MobileDeveloper
      @MobileDeveloper  4 роки тому

      Сейчас да ) тогда об этом не знал ) и оно вроде в экспериментальной версии находилось )