Как передать данные между фрагментами андроид

Доступ к View внутри фрагмента

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

Доступ к View внутри динамического фрагмента из активности

Рассмотрим пример доступа к компоненту, который находится внутри динамического фрагмента из активности.

Фрагмент может иметь собственную разметку и содержать различные компоненты View: TextView, EditText и т.д. Напрямую из активности обратиться к нужному компоненту и поменять, например, текст в TextView не получится. А как же достучаться до нужного компонента? Рассмотрим простой пример.

Создадим класс фрагмента MyFragment.java:

В методе onCreateView() мы указали ресурс разметки R.layout.fragmentlayout. Давайте создадим разметку для фрагмента.

res/layout/fragmentlayout.xml

В данной разметке нас интересует вторая текстовая метка с идентификатором fragmenttext.

Создадим разметку для основной активности:

Последняя компоновка LinearLayout с идентификатором myfragment является контейнером для фрагмента, который будет его замещать. Напишем код для главной активности:

При запуске программы мы получаем экземпляр класса FragmentTransaction и добавляем фрагмент на экран вместо LinearLayout. Теперь текстовая метка фрагмента доступна для изменения — получаем ссылку на нужный компонент и устанавливаем требуемый текст.

Передача данных между фрагментами

Когда мы заменяем контейнер своим фрагментом, то он становится частью активности и получаем доступ к компонентам стандартным способом, как в примере выше. Если мы используем фрагменты как самостоятельные элементы, то доступ к компонентам происходит немного по-другому. Так как фрагменты не существуют сами по себе, а только внутри активности, то сначала нужно получить доступ к родительской активности через метод getActivity(), а затем уже можно получить доступ к нужному компоненту из фрагмента:

Создадим разметки для двух фрагментов. В одном разместим текстовое поле, а во втором кнопку и текстовую метку, в которой будем выводить текст из текстового поля первого фрагмента:

res/layout/redfragment.xml

res/layout/bluefragment.xml

В код первого фрагмента добавим только наполнение из разметки:

В класс второго фрагмента добавим код для чтения данных из первого фрагмента. Сделаем это в методе onStart():

Мы получаем ссылки на все компоненты и обрабатываем щелчок мыши. В разметку активности добавьте два созданных фрагмента и запустите пример. Введите какой-нибудь текст в текстовом поле (напоминаю, что он относится к первому фрагменту). Нажмите на кнопку, которая относится ко второму фрагменту. В текстовой метке второго фрагмента появится введённым вами текст.

Источник

Русские Блоги

Три способа передачи данных между фрагментами Android

Android] Три способа передачи данных между фрагментами

I. Введение

В процессе разработки Android мы знаем важность Activity, но начиная с android3.0, фрагмент, который появляется в android, на самом деле не менее важен, чем Activity. Сегодня я кратко расскажу о трех способах передачи данных между фрагментами.

Во-вторых, подготовить к работе

Шаг 1: Создайте Activity с именем MainActivity. Соответствующий файл макета выглядит следующим образом (перехватывается только основная часть):

Шаг 2: Создайте два фрагмента, MenuFragment и MainFragment. Соответствующий макет выглядит следующим образом:
Основная структура MenuFragment:

Основная структура основного фрагмента:

шаг 3: каждый из двух фрагментов представляет макет (в методе onCreateView ()) (для конкретного кода обращайтесь к исходному коду). Следует отметить, что MenuFragment является ListView. Здесь 5 данных добавляются вручную для заполнения;
step4: введите эти два фрагмента в метод onCreate () MainActivity:

Читайте также:  Бортовой компьютер для android

Отображаемый интерфейс выглядит следующим образом:

Вышеуказанные приготовления завершены!

Соответствующие операции трех методов передачи данных

спрос: Мы щелкаем соответствующие данные записи, показанные на рисунке выше, и заменяем текстовые данные, соответствующие правой (желтая кнопка), текстом, отображаемым записью. Например: я щелкаю четвертую запись слева, и текст на правой кнопке меняется на » Это четвертый кусок данных », чтобы добиться передачи данных между фрагментами. Далее описаны три способа достижения передачи данных между фрагментами.

  • 1. Установите метод setData () в MainFragment и установите имя кнопки изменения в методе;
  • 2. Получите MainFragment через метку в событии щелчка элемента ListView в MenuFragment и вызовите соответствующий метод setData (), чтобы установить данные для достижения цели передачи данных.

Всего двумя шагами выше можно достичь цели передачи данных.

Способ второй
Данные передаются через обратный вызов интерфейса.

  • Шаг 1: Создайте интерфейс и установите метод, соответствующий интерфейсу в Menuragment:
  • Шаг 2. Выполните обратный вызов интерфейса в событии щелчка элемента ListView в MenuFragment.
  • Шаг 3: Получить метод set интерфейса в соответствии с menuFragment в MainActivity и выполнить передачу данных в этом методе следующим образом:

С помощью трех вышеперечисленных шагов вы также можете легко передавать данные фрагмента.

Способ третий
использует трехстороннюю среду с открытым исходным кодом:EventBus
Тогда возникает вопрос: что такое EventBus? ? ?
Проще говоря,EventBusШина событий публикации / подписки, оптимизированная для Android. Основная функция — заменить Intent, Handler, BroadCast для передачи сообщений между Fragment, Activity, Service и потоком. Упрощенная связь между компонентами в приложении, между компонентами и фоновыми потоками.Преимуществами являются меньшие издержки, более элегантный код и разделение отправителя и получателя.Например, запросите сеть и уведомите пользовательский интерфейс через обработчик или широковещательную рассылку, когда сеть вернется. Два фрагмента должны обмениваться данными через прослушиватель. Эти требования могут быть выполненыEventBusДля достижения.
Теперь мы используем EventBus для передачи данных между следующими фрагментами:

  • Шаг 1: Представляем EventBus
  • Шаг 2: Зарегистрировать получатель события
    Здесь MainFragment предназначен для получения данных, отправленных MenuFragment, поэтому мы регистрируемся в методе onCreateView () в MainFragment:
  • Шаг 3: Отправить событие
    Примечание:На самом деле существует шаг для определения типа события перед отправкой события, здесь мы передаем только один тип данных, поэтому этот шаг отменяется.
    MenuFragment отправляет данные в MainFragment, поэтому мы отправим данные для передачи в MenuFragment для операции события:
  • шаг 4: получение сообщений и обработка
    В MainFragment мы получаем данные, переданные из MenuFragment, и выполняем соответствующую обработку (Примечание. На этом шаге версии EventBus 3.0 необходимо написать аннотацию @Subscribe (отличается от версии 2.4)) :

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

  • шаг 5: прием события выхода из системы

Вышеприведенные пять шагов завершили передачу данных между фрагментами, что представляется более сложным, чем два вышеупомянутых метода, но когда мы включаем сложную передачу данных между фрагментами (например, вложение нескольких фрагментов во фрагменты), мы будем Испытайте свежесть EventBus

Источник

Полный список

— рассмотрим взаимодействие между Activity и ее фрагментами

После размещения фрагмента, хотелось бы начать с ним взаимодействовать. Т.е. размещать View-компоненты и работать с ними, обращаться к фрагментам из Activity и наоборот. Попробуем это реализовать.

Читайте также:  Отправка смс для android

Для чистоты эксперимента будем работать с двумя фрагментами: статическим и динамическим.

Project name: P1061_FragmentActivity
Build Target: Android 4.1
Application name: FragmentActivity
Package name: ru.startandroid.develop.p1061fragmentactivity
Create Activity: MainActivity

В strings.xml добавим строки:

Создаем layout и классы для двух фрагментов.

У фрагмента нет привычного для нас метода findViewById для поиска компонентов с экрана. Поэтому вызываем этот метод для View, которое будет содержимым фрагмента. В методе onCreateView мы создаем View и сразу же находим в нем кнопку и ставим ей обработчик. Затем отдаем View системе.

Все аналогично Fragment1.

Настраиваем основное Activity.

Кнопка, компонент fragment, в который помещен Fragment1, и контейнер FrameLayout, в который потом поместим Fragment2.

Обратите внимание на атрибут tools:layout. В нем указан layout-файл, и мы можем на этапе разработки видеть, как будет выглядеть статический фрагмент, когда приложение будет запущено.

Для этого надо нажать правой кнопкой на компоненте fragment, и через пункт Fragment Layout указать нужный layout.

Здесь мы просто добавляем Fragment2 в контейнер.

Все сохраняем, запускаем приложение.

Жмем кнопку Log в первом фрагменте и смотрим лог:

Button click in Fragment1

Жмем Log во втором фрагменте:

Button click in Fragment2

Все ок. Компоненты в фрагментах нашлись и обработчики среагировали на нажатия.

Атрибут onClick, который мы привыкли использовать для кнопки, здесь не прокатит. Указанный в этом атрибуте метод, будет вызван в Activity, а не в фрагменте.

Доступ к фрагменту из Activity

Разберемся, как получить доступ к фрагменту из Activity. Для этого у FragmentManager есть метод findFragmentById, который на вход принимает id компонента fragment (если фрагмент статический) или id контейнера (если динамический).

У нас в main.xml есть кнопка btnFind, вызывающая метод onClick при нажатии. Дорисуем в MainActivity.java метод onClick:

Используем метод findFragmentById. В первом случае на вход передаем id компонента fragment, т.к. Fragment1 у нас размещен именно так. При поиске Fragment2 указываем id контейнера, в который этот фрагмент был помещен. В результате метод findFragmentById возвращает нам объект Fragment.

Далее мы получаем доступ к его View с помощью метода getView, находим в нем TextView и меняем текст.

Все сохраняем, запускаем. Жмем кнопку Find

Тексты в фрагментах обновились. Тем самым из Activity мы достучались до фрагментов и их компонентов.

На всякий случай проговорю одну вещь из разряда «Спасибо кэп!». Если посмотреть на код MainActivity, то можно заметить, что работая с frag2 в методе onCreate и с frag2 в методе onClick мы работаем с текущим фрагментом Fragment2. Это так и есть. Оба frag2 в итоге будут ссылаться на один объект. Так что, если вы динамически добавили фрагмент, то у вас уже есть ссылка на него, и искать его через findFragmentById вам уже не надо.

Доступ к Activity из фрагмента

Теперь попробуем из фрагмента поработать с Activity. Для этого фрагмент имеет метод getActivity.

Давайте перепишем обработчик кнопки в первом фрагменте. Будем менять текст кнопки btnFind.

Получаем Activity методом getActivity, ищем в нем кнопку и меняем текст.

Сохраняем, запускаем. Жмем кнопку в первом фрагменте:

Работает. Из фрагмента мы поменяли компонент Activity.

Обработка в Activity события из фрагмента

Рассмотрим механизм, который описан в хелпе: фрагмент генерирует некое событие и ставит Activity обработчиком.

Например, в Activity есть два фрагмента. Первый – список заголовков статей. Второй – отображает содержимое статьи, выбранной в первом. Мы нажимаем на заголовок статьи в первом фрагменте и получаем содержимое во втором. В этом случае, цель первого фрагмента – передать в Activity информацию о том, что выбран заголовок. А Activity дальше уже сама решает, что делать с этой информацией. Если, например, приложение запущено на планшете в горизонтальной ориентации, то можно отобразить содержимое статьи во втором фрагменте. Если же приложение запущено на смартфоне, то экран маловат для двух фрагментов и надо запускать отдельное Activity со вторым фрагментом, чтобы отобразить статью.

Читайте также:  Android sdk manager install fail

Фишка тут в том, что первому фрагменту неинтересны все эти терзания Activity. Фрагмент – обособленный модуль. Его дело — проинформировать, что выбрана статья такая-то. Ему не надо искать второй фрагмент и работать с ним – это дело Activity.

Тут немного отвлекусь на небольшое лирическое отступление. Модульность, вообще, — очень важная и полезная штука. И ее надо использовать для универсальности, удобности и легкости в понимании работы своих приложений. Но уникальных рецептов, как правильно все организовать, конечно, нет. Каждый делает по-своему. Именно по этим причинам я в своих уроках даю чисто технические вещи про отдельные компоненты и не рассказываю, как организовывать и писать целое приложение. Иначе, форум бы уже ломился от сообщений, что я все делаю не так и надо по-другому, и каждый бы излагал свое видение. И была бы куча споров, где одна сторона говорит, что крокодил зеленый, а другая сторона говорит, что он нифига не зеленый, а длинный ))

Вернемся к уроку. Фрагмент должен сообщить в Activity, что выбрана статья. Для этого он будет вызывать некий метод в Activity. И как нам сообщает хелп, лучший способ тут – это использовать интерфейс, который мы опишем в фрагменте и который затем будет реализован в Activity. Схема известная и распространенная. Давайте реализуем. В нашем приложении никаких статей нет, поэтому будем просто передавать произвольную строку из второго фрагмента в Activity. А Activity уже будет отображать эту строку в первом фрагменте.

Описываем интерфейс onSomeEventListener. В нем метод someEvent, который на вход получает строку. Этот интерфейс будет реализовывать Activity.

В методе onAttach мы на вход получаем Activity, к которому присоединен фрагмент. Мы пытаемся привести это Activity к типу интерфейса onSomeEventListener, чтобы можно было вызывать метод someEvent и передать туда строку. Теперь someEventListener ссылается на Activity.

Далее, в onCreateView, в обработчике кнопки мы вызываем метод someEvent и передаем туда текст. Этот метод будет отработан в Activity.

Теперь меняем Activity.

Дописываем интерфейс onSomeEventListener к описанию класса.

onCreate без изменений.

Реализуем метод someEvent. Просто ищем первый фрагмент и вставляем туда текст.

Все сохраняем и запускаем. Жмем кнопку во втором фрагменте:

Второй фрагмент передал через интерфейс строку в Activity, а оно нашло первый фрагмент и отобразило там эту строку.

На следующем уроке:

— размещаем элементы в ActionBar

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью