- PVSM.RU - https://www.pvsm.ru -

Как в Android’е передать переменную из фрагмента в активность?

Рассказ о том, как в Android'е передать информацию из фрагмента (Fragment) в активность (Activity). Информация будет полезной для новичков (джуниоров), осваивающих программирование для Android, и вряд ли будет интересной для миддлов и сеньоров.

Запускаем IDE (integrated development environment) Android Studio [1]. Создаём новый проект: File -> New -> New Project. Выбираем «Empty Activity», жмём «Next».

Как в Android'е передать переменную из фрагмента в активность? - 1

Заполняем поля «Name», «Package name», «Save location».

Как в Android'е передать переменную из фрагмента в активность? - 2

IDE автоматически создаст два файла: «MainActivity.java» — в каталоге «java/[имя пакета]», «activity_main.xml» — в каталоге «res/layout».

Как в Android'е передать переменную из фрагмента в активность? - 3

Как в Android'е передать переменную из фрагмента в активность? - 4

Java-файл определяет, что приложение делает, xml – как оно выглядит. Делает же оно пока совсем мало, только «setContentView(R.layout.activity_main);». Эта строка указывает приложению при запуске использовать макет «activity_main.xml». И, поскольку макет содержит только один виджет типа «TextView» с текстом «Hello World!», то и выглядит наше приложение тоже весьма скромно.

Как в Android'е передать переменную из фрагмента в активность? - 5

В папке проекта создадим фрагмент с именем «Fragment1».

Как в Android'е передать переменную из фрагмента в активность? - 6

Как в Android'е передать переменную из фрагмента в активность? - 7

IDE создаст два файла: «Fragment1» и «fragment_fragment1.xml».

Как в Android'е передать переменную из фрагмента в активность? - 8

Как в Android'е передать переменную из фрагмента в активность? - 9

Откроем файл макета фрагмента и удалим ненужный нам виджет «TextView» с приветственной строкой.

Как в Android'е передать переменную из фрагмента в активность? - 10

Переключимся в режим дизайна и перетащим на макет кнопку (Button).

Как в Android'е передать переменную из фрагмента в активность? - 11

IDE создаст кнопку с идентификатором «button1».

Как в Android'е передать переменную из фрагмента в активность? - 12

Теперь отредактируем макет главной активности, т.е. файл «activity_main.xml»

Как в Android'е передать переменную из фрагмента в активность? - 13

Переместим текстовый виджет повыше и добавим в макет созданный нами фрагмент (для этого нужно перетащить элемент "<>" на макет, выбрать «Fragment1» и кликнуть «OK»).

Как в Android'е передать переменную из фрагмента в активность? - 14

В макете активности в настройках фрагмента установим layout_height=«wrap_content» и отредактируем на свой вкус его размещение. Также изменим идентификатор текстового поля на «textReport», а фрагмента — на «fragmentWithButton».

Как в Android'е передать переменную из фрагмента в активность? - 15

Запустим эмулятор (Shift+F10) и посмотрим, что получилось.

Как в Android'е передать переменную из фрагмента в активность? - 16

Приложение отображает надпись «Hello World!» и кнопку «BUTTON». Надпись выводится из активности, кнопка же принадлежит фрагменту. Кнопка нажимается, но никакого эффекта это пока не даёт. Попробуем запрограммировать надпись отображать количество нажатий кнопки. Для этого нам нужно будет передать сообщение о нажатии кнопки из фрагмента в активность.

Вначале научим фрагмент подсчитывать число нажатий кнопки. Откроем файл «Fragment1.java».

Как в Android'е передать переменную из фрагмента в активность? - 17

Добавим переменную «counter». В методе «onCreateView», который вызывается сразу после создания фрагмента, создадим «слушатель» кнопки. IDE потребует имплементировать View.OnClickListener — соглашайтесь (Alt + Enter). Создадим (переопределим) метод onClick, который будет увеличивать значение переменной «counter» при каждом клике по кнопке и выводить всплывающее сообщение.

Как в Android'е передать переменную из фрагмента в активность? - 18

Проверим в эмуляторе (снова Shift+F10), как это работает. Нажатие кнопки приводит к появлению в нижней части экрана приложения всплывающего сообщения «Количество нажатий кнопки: … ».

Как в Android'е передать переменную из фрагмента в активность? - 19

Отлично, идём дальше. Наша главная цель — передать информацию (в данном случае — число нажатий кнопки) из экземпляра фрагмента в экземпляр активности. Увы, жизненные циклы активностей [2] и фрагментов [3] организованы так, что Android (почти) не позволяет активности и фрагменту общаться напрямую, поэтому нам понадобится посредник-интерфейс. Назовём его «Postman» (почтальон). Интерфейс можно создавать как в отдельном файле, так и в файле с кодом фрагмента; мы выберем первый вариант. Наш интерфейс Postman будет содержать единственный абстрактный (без «тела») метод «fragmentMail».

Как в Android'е передать переменную из фрагмента в активность? - 20

Переменную «numberOfClicks» мы будем использовать как «конверт» для передачи сообщений от фрагмента в активность.

Откроем файл с кодом активности «MainActivity.java». Как мы помним, он выглядит так:

Как в Android'е передать переменную из фрагмента в активность? - 21

Имплементируем интерфейс «Postman» и добавим в активность метод интерфейса «fragmentMail», переопределив его (Override [4]).

Как в Android'е передать переменную из фрагмента в активность? - 22

Теперь, как только активность «увидит» в переменной «numberOfClicks» новое значение, она выведет обновлённое сообщение в текстовом поле «textReport».

Но нам ведь ещё нужно «положить письмо в конверт», т.е. передать в переменную количество кликов по кнопке. А это мы делаем в коде фрагмента. Открываем файл «Fragment1.java». Добавляем в подпись класса имплементацию интерфейса «Postman».

Как в Android'е передать переменную из фрагмента в активность? - 23

IDE потребует переопределить метод интерфейса «fragmentMail», но делать в нём мы ничего не будем, поэтому оставим его тело пустым.
Как в Android'е передать переменную из фрагмента в активность? - 24

Нам понадобится ссылка на экземпляр активности. Мы получим её при присоединении фрагмента к активности так:
Как в Android'е передать переменную из фрагмента в активность? - 25

В метод «onClick» (тот самый, который вызывается при нажатии кнопки нашего фрагмента) добавим обращение к интерфейсу из экземпляра активности.

Как в Android'е передать переменную из фрагмента в активность? - 26

Финальный код фрагмента после удаления (для компактности) комментариев выглядит так:
Как в Android'е передать переменную из фрагмента в активность? - 27

Теперь наш фрагмент считает количество нажатий кнопки, выводит их во всплывающем сообщении и затем с помощью интерфейса «Postman» передаёт значение переменной-счётчика в переменную numberOfClicks, служащую контейнером-конвертом для пересылки сообщения от фрагмента к активности. Активность, получая новое сообщение, тут же отображает его в своём текстовом поле-виджете с идентификатором «textReport». Цель достигнута!
Как в Android'е передать переменную из фрагмента в активность? - 28

P.S.: Смена языка программирования с Java на Kotlin позволяет существенно сократить код фрагмента:

Как в Android'е передать переменную из фрагмента в активность? - 29

P.P.S.: Скачать файлы проекта можно здесь: Java [5], Kotlin [6].

Автор: KotlinStudio

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/315208

Ссылки в тексте:

[1] Android Studio: https://developer.android.com/studio/

[2] активностей: https://developer.android.com/guide/components/activities/activity-lifecycle

[3] фрагментов: https://developer.android.com/guide/components/fragments

[4] Override: https://habr.com/ru/users/override/

[5] Java: https://github.com/kotlin-studio/ForHabrCom_AndroidActivityFragmentCommunication_Java

[6] Kotlin: https://github.com/kotlin-studio/ForHabrCom_AndroidActivityFragmentCommunication_Kotlin

[7] Источник: https://habr.com/ru/post/448744/?utm_source=habrahabr&utm_medium=rss&utm_campaign=448744