SlideShare a Scribd company logo
Fragments
Android
Дмитрий Колесников
О чём речь?
Fragment представляет часть пользовательского интерфейса.
Всегда привязан к Activity.
Имеет собственный lifecycle, привязанный к Activity. Подробнее
Плюсы:
Позволяет реализовать гибкий интерфейс.
Облегчает поддержку разных экранов.
Декомпозиция и упрощение логики.
Пример использования.
Основные классы.
API 4+ via SupportLibrary
android.support.v4.app.FragmentActivity
android.support.v7.app.ActionBarActivity
android.support.v7.app.AppCompatActivity
android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
API 11+
android.app.Fragment
android.app.FragmentManager
android.app.FragmentTransaction
Жизненный цикл
Жизненный цикл
onAttach(Activity)
Вызывается, когда фрагмент привязывается к Activity. С этого момента можно
использовать getActivity()
onCreate(Bundle)
Вызывается, когда система создает фрагмент.
onCreateView(LayoutIn ater, ViewGroup, Bundle)
Вызывается, когда фрагмент привязывается к иерархии View.
onActivityCreated(Bundle)
Вызывается, когда завершается onCreate() у Activity.
onStart(); onResume(); onPause(); onStop()
Аналогичные методы Activity.
onDestroyView()
Когда иерархия View разбирается.
onDestroy()
Вызывается, когда система разрушает фрагмент.
onDetach()
фрагмент больше не ассоциируется с Activity. С этого момента getActivity() возвращает null
Базовая реализация.
onCreate(Bundle)
Инициализируем все ресурсы, связанные с фрагментом, кроме UI.
onCreateView(LayoutIn ater, ViewGroup, Bundle)
Создаем и возвращаем View фрагмента.
onViewCreated(View, Bundle)
Инициализируем UI, устанавливаем adapter или другие данные.
onResume()
Инициализируем “дорогие” ресурсы: GPS, анимация, постоянное использование сети тд.
onPause()
Освобождаем “дорогие” ресурсы, сохраняем состояние.
onDestroyView()
Зануляем все ссылки на все View если мы их сохраняли.
Статичные фрагменты.
1 <?xml version="1.0" encoding="utf-8"?>
2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent">
5
6 <fragment class="com.example.android.apis.app.TitlesFragment"
7 android:id="@+id/titles"
8 android:layout_width="match_parent"
9 android:layout_height="match_parent" />
10
11 </FrameLayout>
Нельзя убрать.
Нельзя передавать аргументы.
Обязательно должен быть задан id или tag.
Динамические фрагменты.
Добавляются в Runtime с помощью FragmentTransaction
1 FragmentTransaction transaction = getFragmentManager()
2 .beginTransaction();
3 transaction.add(R.id.frame, new Fragment());
4 transaction.commit();
getFragmentManager() (или getSupportFragmentManager() в случае использования Support
library)
Вызывается в Activity, возвращает FragmentManager
FragmentManager.beginTransaction()
Создаем транзакцию.
commit(), commitAllowingStateLoss()
выполняем транзакцию.
FragmentManager.executePendingTransactions()
Убеждаемся что все транзакции завершены.
Состояние сохраняется.
Операции с фрагментами.
fragmentManager. ndFragmentById(int)
fragmentManager. ndFragmentByTag(String)
transaction.add(int, Fragment, String)
transaction.remove(Fragment)
transaction.replace(int, Fragment, String)
transaction.hide(Fragment)
transaction.show(Fragment)
transaction.detach(Fragment) API 13
transaction.attach(Fragment) API 13
С фрагментами задекларированными в layout почти ничего делать нельзя.
Backstack
FragmentTransaction.addToBackStack(String)
FragmentManager.popBackStack()
FragmentManager.getBackStackEntryCount()
FragmentManager.getBackStackEntryAt(int)
По возвращению из стека onCreateView(), onActivityCreated(), onStart(), and onResume()
Сохранение состояния
Нельзя хранить ссылки на элементы layout.
Сохраняется в onSaveInstanceState(Bundle)
Восстанавливается если savedState не null в onCreate(), onCreateView(), onViewCreated(), и
onActivityCreated(). (с API 17 onViewStateRestored())
Можно переиспользовать: setRetainInstance(true).
Activity - Fragment, Fragment - Fragment.
getFragmentManager(). ndFragmentById(int)
getFragmentManager(). ndFragmentByTag(String)
Fragment.getActivity()
Interfaces.
Fragment.setTargetFragment(Fragment, int), Fragment.getTargetFragment().
Events: EventBus, Intents/LocalBroadcastReceiver
Наследники
DialogFragment
ListFragment
PreferenceFragment нет в SupportLibrary
WebViewFragment нет в SupportLibrary
MapFragment из Google Services
ViewPager + FragmentPagerAdapter
Вложенные фрагменты API 17
Fragment.getChildFragmentManager()
Fragment.getParentFragment()
Состояние сохраняется.
Жизненный цикл onCreateView() onDestroyView()
Не умеет в Backstack.
Нельзя использовать setRetainInstance(boolean)
Проблемы с анимацией.
Да и вообще не очень...
Подробнее
Делайте правильно, а не правильно - не делайте.
Хорошо:
newInstance(...)
setArguments()
Все диалоги – фрагменты
Хорошее разделение по смыслу: один фрагмент – одна задача.
Сохранять состояние.
Утилитные классы для избежания копипасты.
Делайте правильно, а не правильно - не делайте.
Плохо, иногда очень:
Отсутствие пустого конструктора.
Забытые ссылки на элементы layout.
Забытые вложенные анонимные классы, асинхронные задачи и тд.
Вложенные фрагменты пересоздаются, даже если состояние родительского
восстанавливается.
Ссылки
API Guides
Google Fragment Training
Fragment
FragmentTransaction
FragmentManager
FragmentPagerAdapter

More Related Content

PDF
Android - 09 - Fragments
PPTX
PPT
Moxy – реализация MVP под Android. С щепоткой магии
PPTX
MVP, Moxy. Как правильно пользоваться
PDF
Fragments, ActionBar, Drawer
PPTX
Ivan Shaban - Robotlegs 2+
PPTX
Разработка WPF приложений в стиле ViewModel First
PDF
Markelov-AUG-Jira
Android - 09 - Fragments
Moxy – реализация MVP под Android. С щепоткой магии
MVP, Moxy. Как правильно пользоваться
Fragments, ActionBar, Drawer
Ivan Shaban - Robotlegs 2+
Разработка WPF приложений в стиле ViewModel First
Markelov-AUG-Jira

What's hot (8)

PDF
Git (presentation)
PDF
Лекция Android. Fragments, ActionBar, Drawer
PDF
Лекция 2. Activity.
PDF
AndroidMVPHelper
PPTX
Как написать XAML-приложение без Message Bus
PPT
Ubuntu+python+selenium=легкий старт
PDF
Релиз PHP7 - что нас ждет в октябре 2015
PDF
Лекция Android. Хранение данных
Git (presentation)
Лекция Android. Fragments, ActionBar, Drawer
Лекция 2. Activity.
AndroidMVPHelper
Как написать XAML-приложение без Message Bus
Ubuntu+python+selenium=легкий старт
Релиз PHP7 - что нас ждет в октябре 2015
Лекция Android. Хранение данных
Ad

Viewers also liked (20)

PDF
PPTX
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
PPTX
Семантика текста (HTML5 тема 04 - семантика текста)
PPTX
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
PDF
Database (Lecture 14 – database)
PDF
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
PDF
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
PDF
Android - 10 - Graphics
PDF
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
PPTX
Стилизация текста (HTML5 тема 05 - стилизация текста)
PDF
Системы автоматизированной сборки (Lecture 05 – gradle)
PDF
PDF
PDF
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
PDF
Toolbar (Lecture 16 – toolbar)
PDF
Animations (Lecture 17 – animations)
PDF
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
PDF
Push Notifications (Lecture 22 – push notifications)
PDF
PDF
Android - 05 - Android basics
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Семантика текста (HTML5 тема 04 - семантика текста)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
Database (Lecture 14 – database)
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Android - 10 - Graphics
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Стилизация текста (HTML5 тема 05 - стилизация текста)
Системы автоматизированной сборки (Lecture 05 – gradle)
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Toolbar (Lecture 16 – toolbar)
Animations (Lecture 17 – animations)
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
Push Notifications (Lecture 22 – push notifications)
Android - 05 - Android basics
Ad

Similar to Fragments (Lecture 09 – Fragments) (20)

PDF
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
PDF
Android осень 2013 лекция 3
PPTX
iOS and Android Mobile Test Automation
PDF
Android - 11 - Multithreading
PDF
Wild Async .NET world: AID Kit for boy-scouts
PDF
Mobile automation uamobile
PDF
MWWM
PDF
Adn@it'summer - Изоморфные приложения с React и Redux
PDF
FPUG Dzyga presentation
PPTX
Создание графического интерфейса пользователя мобильных Android приложений (ч...
PPTX
Fragments&Loaders
PPTX
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
PPTX
Views обзор
PDF
Android осень 2013 лекция 2
PPTX
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
PPTX
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
PDF
МАИ, Сети ЭВМ, Лекция №5
DOCX
Enterprise flex pure mvc.v4
PPTX
Enterprise flex pure mvc, slides, russian
PDF
Java осень 2014 занятие 5
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Android осень 2013 лекция 3
iOS and Android Mobile Test Automation
Android - 11 - Multithreading
Wild Async .NET world: AID Kit for boy-scouts
Mobile automation uamobile
MWWM
Adn@it'summer - Изоморфные приложения с React и Redux
FPUG Dzyga presentation
Создание графического интерфейса пользователя мобильных Android приложений (ч...
Fragments&Loaders
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Views обзор
Android осень 2013 лекция 2
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
МАИ, Сети ЭВМ, Лекция №5
Enterprise flex pure mvc.v4
Enterprise flex pure mvc, slides, russian
Java осень 2014 занятие 5

More from Noveo (20)

PPTX
Гуманитарные специальности в IT-индустрии
PPTX
Box model, display and position (HTML5 тема 07 - box model, display position)
PPTX
Основы CSS (HTML5 тема 02 - основы CSS)
PPTX
Структура HTML документа (HTML5 тема 01 - структура html документа)
PPTX
Yii2
PPTX
Сессии и авторизация
PPTX
Rest
PPTX
PHP basic
PPTX
PHP Advanced
PPTX
PHP and MySQL
PPTX
MySQL
PDF
RxJava+RxAndroid (Lecture 20 – rx java)
PDF
Работа с соцсетями (Lecture 19 – social)
PDF
Работа с геоданными (Lecture 18 – geolocation)
PDF
Material Design (Lecture 15 – material design)
PDF
XML, JSON (Lecture 11 – XML, JSON)
PDF
Работа с графической подсистемой (Lecture 10 – Graphics)
PDF
Введение в Android-разработку (Lecture 06 – basics)
PDF
Android - 16 - QR
PDF
03 коллекции
Гуманитарные специальности в IT-индустрии
Box model, display and position (HTML5 тема 07 - box model, display position)
Основы CSS (HTML5 тема 02 - основы CSS)
Структура HTML документа (HTML5 тема 01 - структура html документа)
Yii2
Сессии и авторизация
Rest
PHP basic
PHP Advanced
PHP and MySQL
MySQL
RxJava+RxAndroid (Lecture 20 – rx java)
Работа с соцсетями (Lecture 19 – social)
Работа с геоданными (Lecture 18 – geolocation)
Material Design (Lecture 15 – material design)
XML, JSON (Lecture 11 – XML, JSON)
Работа с графической подсистемой (Lecture 10 – Graphics)
Введение в Android-разработку (Lecture 06 – basics)
Android - 16 - QR
03 коллекции

Fragments (Lecture 09 – Fragments)

  • 2. О чём речь? Fragment представляет часть пользовательского интерфейса. Всегда привязан к Activity. Имеет собственный lifecycle, привязанный к Activity. Подробнее Плюсы: Позволяет реализовать гибкий интерфейс. Облегчает поддержку разных экранов. Декомпозиция и упрощение логики.
  • 4. Основные классы. API 4+ via SupportLibrary android.support.v4.app.FragmentActivity android.support.v7.app.ActionBarActivity android.support.v7.app.AppCompatActivity android.support.v4.app.Fragment android.support.v4.app.FragmentManager android.support.v4.app.FragmentTransaction API 11+ android.app.Fragment android.app.FragmentManager android.app.FragmentTransaction
  • 6. Жизненный цикл onAttach(Activity) Вызывается, когда фрагмент привязывается к Activity. С этого момента можно использовать getActivity() onCreate(Bundle) Вызывается, когда система создает фрагмент. onCreateView(LayoutIn ater, ViewGroup, Bundle) Вызывается, когда фрагмент привязывается к иерархии View. onActivityCreated(Bundle) Вызывается, когда завершается onCreate() у Activity. onStart(); onResume(); onPause(); onStop() Аналогичные методы Activity. onDestroyView() Когда иерархия View разбирается. onDestroy() Вызывается, когда система разрушает фрагмент. onDetach() фрагмент больше не ассоциируется с Activity. С этого момента getActivity() возвращает null
  • 7. Базовая реализация. onCreate(Bundle) Инициализируем все ресурсы, связанные с фрагментом, кроме UI. onCreateView(LayoutIn ater, ViewGroup, Bundle) Создаем и возвращаем View фрагмента. onViewCreated(View, Bundle) Инициализируем UI, устанавливаем adapter или другие данные. onResume() Инициализируем “дорогие” ресурсы: GPS, анимация, постоянное использование сети тд. onPause() Освобождаем “дорогие” ресурсы, сохраняем состояние. onDestroyView() Зануляем все ссылки на все View если мы их сохраняли.
  • 8. Статичные фрагменты. 1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <fragment class="com.example.android.apis.app.TitlesFragment" 7 android:id="@+id/titles" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" /> 10 11 </FrameLayout> Нельзя убрать. Нельзя передавать аргументы. Обязательно должен быть задан id или tag.
  • 9. Динамические фрагменты. Добавляются в Runtime с помощью FragmentTransaction 1 FragmentTransaction transaction = getFragmentManager() 2 .beginTransaction(); 3 transaction.add(R.id.frame, new Fragment()); 4 transaction.commit(); getFragmentManager() (или getSupportFragmentManager() в случае использования Support library) Вызывается в Activity, возвращает FragmentManager FragmentManager.beginTransaction() Создаем транзакцию. commit(), commitAllowingStateLoss() выполняем транзакцию. FragmentManager.executePendingTransactions() Убеждаемся что все транзакции завершены. Состояние сохраняется.
  • 10. Операции с фрагментами. fragmentManager. ndFragmentById(int) fragmentManager. ndFragmentByTag(String) transaction.add(int, Fragment, String) transaction.remove(Fragment) transaction.replace(int, Fragment, String) transaction.hide(Fragment) transaction.show(Fragment) transaction.detach(Fragment) API 13 transaction.attach(Fragment) API 13 С фрагментами задекларированными в layout почти ничего делать нельзя.
  • 12. Сохранение состояния Нельзя хранить ссылки на элементы layout. Сохраняется в onSaveInstanceState(Bundle) Восстанавливается если savedState не null в onCreate(), onCreateView(), onViewCreated(), и onActivityCreated(). (с API 17 onViewStateRestored()) Можно переиспользовать: setRetainInstance(true).
  • 13. Activity - Fragment, Fragment - Fragment. getFragmentManager(). ndFragmentById(int) getFragmentManager(). ndFragmentByTag(String) Fragment.getActivity() Interfaces. Fragment.setTargetFragment(Fragment, int), Fragment.getTargetFragment(). Events: EventBus, Intents/LocalBroadcastReceiver
  • 14. Наследники DialogFragment ListFragment PreferenceFragment нет в SupportLibrary WebViewFragment нет в SupportLibrary MapFragment из Google Services ViewPager + FragmentPagerAdapter
  • 15. Вложенные фрагменты API 17 Fragment.getChildFragmentManager() Fragment.getParentFragment() Состояние сохраняется. Жизненный цикл onCreateView() onDestroyView() Не умеет в Backstack. Нельзя использовать setRetainInstance(boolean) Проблемы с анимацией. Да и вообще не очень... Подробнее
  • 16. Делайте правильно, а не правильно - не делайте. Хорошо: newInstance(...) setArguments() Все диалоги – фрагменты Хорошее разделение по смыслу: один фрагмент – одна задача. Сохранять состояние. Утилитные классы для избежания копипасты.
  • 17. Делайте правильно, а не правильно - не делайте. Плохо, иногда очень: Отсутствие пустого конструктора. Забытые ссылки на элементы layout. Забытые вложенные анонимные классы, асинхронные задачи и тд. Вложенные фрагменты пересоздаются, даже если состояние родительского восстанавливается.
  • 18. Ссылки API Guides Google Fragment Training Fragment FragmentTransaction FragmentManager FragmentPagerAdapter