SlideShare a Scribd company logo
Fragments
Жилич Роман
Android Internship 2014
О чем речь?
• Fragment – класс, реализующий часть(фрагмент)
Activity.
• Позволяет: реализовать гибкий интерфейс,
облегчить поддержу разных экранов,
декомпозировать и упростить логику.
• Всегда привязан к Activity.
• Собственный жизненный цикл, привязанный к циклу
Activity. Подробнее.
На картинках все просто
Основные классы
API 11+
-android.app.Fragment
-android.app.FragmentManager
-android.app.FragmentTransaction
API 4+ via SupportLibrary
-android.support.v4.app.FragmentActivity
-android.support.v4.app.Fragment
-android.support.v4.app.FragmentManager
-android.support.v4.app.FragmentTransaction
Жизненный цикл
● onAttach(Activity) – вызывается, когда фрагмент привязывается к Activity. С
этого момента можно использовать getActivity().
● onCreateView(LayoutInflater, ViewGroup, Bundle) – вызывается, когда
фрагмент привязывается к иерархии View.
● onActivityCreated(Bundle) – вызывается, когда завершается onCreate() у
Activity.
● onDestroyView() - когда иерархия View разбирается.
● onDetach() - фрагмент больше не ассоциируется с Activity. С этого момента
getActivity() возвращает null.
Базовая реализация
● onCreate(Bundle) – инициализируем все ресурсы, связанные с фрагментом,
кроме UI.
● onCreateView(LayoutInflater, ViewGroup, Bundle) – создаем и возвращаем View
фрагмента. Реализация этого метода не обязательна.
● onActivityCreated(Bundle savedInstanceState) – инициализируем UI,
устанавливаем adapter или другие данные.
Базовая реализация
● onResume() - инициализируем “дорогие” ресурсы: GPS, анимация, постоянное
использование сети тд.
● onPause() - освобождаем “дорогие” ресурсы, сохраняем состояние.
● onDestoryView() - зануляем все ссылки на все View если мы их сохраняли.
Добавление фрагментов
1. Тег <fragment> в layout.
2. Нельзя убрать.
3. Нельзя передавать аргументы.
4. Обязательно должен быть задан id или tag.
Добавление фрагментов
2. В Runtime с использованием FragmentTransaction
● Fragment.setArguments(Bundle) – Передаем аргументы.
● FragmentManager.beginTransaction() - Создаем транзакцию.
● FragmentManager.executePendingTransactions() - Убеждаемся что все
транзакции завершены.
● commit(), commitAllowingStateLoss() - выполняем транзакцию.
● Состояние сохраняется.
Операции с фрагментами
●FragmentManager.findFragmentById(int)
●FragmentManager.findFragmentByTag(String)
●add(int, Fragment, String)
●remove(Fragment)
●replace(int, Fragment, String)
●hide(Fragment)
●show(Fragment)
●detach(Fragment) API 13
●attach(Fragment) API 13
●С фрагментами задекларированными в layout почти ничего делать нельзя.
Backstack
●FragmentTransaction.addToBackStack(String).
●FragmentManager.popBackStack().
●FragmentManager.getBackStackEntryCount()
●FragmentManager.getBackStackEntryAt(int)
●По возвращению из стека onCreateView(), onActivityCreated(), onStart(), and
onResume().
●Поведение FragmentActivity по умолчанию:
if (!fragmentManager.popBackStackImmediate()) {
finish();
}
Сохранение состояния
●Нельзя хранить ссылки на элементы layout.
●Сохраняется в onSaveInstanceState(Bundle)
●Восстанавливается если savedState не null в onCreate(), onCreateView(), и
onActivityCreated().
●Можно переиспользовать: setRetainInstance(true).
●findFragment…
●Fragment.getActivity(): findViewById, get..., cast и тд.
●Interfaces.
●Fragment.setTargetFragment(Fragment, int), Fragment.
getTargetRequestCode(), Fragment.getTargetFragment().
●Events: EventBus, Intents/LocalBroadcastReceiver
Fragment vs. FragmentActivity
Наследники
●DialogFragment
●ListFragment
●PreferenceFragment нет в SupportLibrary
●WebViewFragment нет в SupportLibrary
●MapFragment из Google Services
●ViewPager + FragmentPagerAdapter
Вложенные фрагменты
API 17
●Fragment.getChildFragmentManager()
●Fragment.getParentFragment()
●Состояние сохраняется.
●Жизненный цикл onCreateView() onDestroyView()
●Проблемы с анимацией.
●Нельзя использовать setRetainInstance(boolean)
●Да и вообще не очень...
Делайте правильно, а не
правильно - не делайте
Хорошо:
● newInstance(...)
● setArguments()
● Все диалоги – фрагменты
● Хорошее разделение по смыслу: один фрагмент – одна задача.
● Сохранять состояние.
● Утилитные классы для избежания копипасты.
● ListFragment, WebViewFragment.
Делайте правильно, а не
правильно - не делайте
Плохо, иногда очень:
● Отсутствие пустого конструктора.
● Забытые ссылки на элементы layout.
● Забытые вложенные анонимные классы, асинхронные задачи и тд.
● Вложенные фрагменты пересоздаются, даже если состояние родительского
восстанавливается.
Ссылки
● API Guides
● Google Fragment Training
● Fragment
● FragmentTransaction
● FragmentManager
● FragmentPagerAdapter

More Related Content

PDF
Fragments (Lecture 09 – Fragments)
PDF
Никита Шультайс. "Система управления версиями git"
PDF
20140310 parallel programming_kalishenko_lecture03-04
PDF
Алексей Кулаков - Современные возможности ES-2015 (Promise, Generators, Proxy)
PPTX
Современные возможности ES-2015 (Promise, Generators, Proxy).
PDF
2012 03 14_parallel_programming_lecture05
PPTX
Обзор возможностей HTML5
PPTX
Как приручить реактивное программирование
Fragments (Lecture 09 – Fragments)
Никита Шультайс. "Система управления версиями git"
20140310 parallel programming_kalishenko_lecture03-04
Алексей Кулаков - Современные возможности ES-2015 (Promise, Generators, Proxy)
Современные возможности ES-2015 (Promise, Generators, Proxy).
2012 03 14_parallel_programming_lecture05
Обзор возможностей HTML5
Как приручить реактивное программирование

What's hot (10)

PPTX
Как приручить реактивное программирование в XAML приложениях
PDF
Релиз PHP7 - что нас ждет в октябре 2015
PDF
TeaVM: dead code elimination and devirtualization
PDF
Лекция Android. Fragments, ActionBar, Drawer
PDF
PDF
Лекция 2. Activity.
PDF
Git (presentation)
PDF
Fragments, ActionBar, Drawer
PDF
Навигация в Android без боли и слез
Как приручить реактивное программирование в XAML приложениях
Релиз PHP7 - что нас ждет в октябре 2015
TeaVM: dead code elimination and devirtualization
Лекция Android. Fragments, ActionBar, Drawer
Лекция 2. Activity.
Git (presentation)
Fragments, ActionBar, Drawer
Навигация в Android без боли и слез
Ad

Similar to Android - 09 - Fragments (15)

PPTX
Fragments&Loaders
PPTX
Views обзор
PDF
Android осень 2013 лекция 2
PDF
Революционный Android. Ищем замену фрагментам
PDF
Mambility. Cтрах и ненависть к фрагментам
PDF
Android Transition - плавные переходы на Android
PDF
Android осень 2013 лекция 1
PDF
Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов ...
PDF
Android Development Course in HSE lecture #3
PDF
Android Development Course in HSE lecture #1
PDF
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
PDF
Олег Годовых «Страх и ненависть в Event Bus»
PDF
Страх и ненависть в Event Bus
PPTX
Создание графического интерфейса пользователя мобильных Android приложений (ч...
PPTX
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Fragments&Loaders
Views обзор
Android осень 2013 лекция 2
Революционный Android. Ищем замену фрагментам
Mambility. Cтрах и ненависть к фрагментам
Android Transition - плавные переходы на Android
Android осень 2013 лекция 1
Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов ...
Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #1
2016 06-11 Данил Перевалов. Создание простых анимаций на андроид
Олег Годовых «Страх и ненависть в Event Bus»
Страх и ненависть в Event Bus
Создание графического интерфейса пользователя мобильных Android приложений (ч...
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Ad

More from Noveo (20)

PPTX
Гуманитарные специальности в IT-индустрии
PPTX
Box model, display and position (HTML5 тема 07 - box model, display position)
PPTX
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
PPTX
Стилизация текста (HTML5 тема 05 - стилизация текста)
PPTX
Семантика текста (HTML5 тема 04 - семантика текста)
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
Push Notifications (Lecture 22 – push notifications)
PDF
RxJava+RxAndroid (Lecture 20 – rx java)
PDF
Работа с соцсетями (Lecture 19 – social)
PDF
Работа с геоданными (Lecture 18 – geolocation)
PDF
Animations (Lecture 17 – animations)
PDF
Toolbar (Lecture 16 – toolbar)
Гуманитарные специальности в IT-индустрии
Box model, display and position (HTML5 тема 07 - box model, display position)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Стилизация текста (HTML5 тема 05 - стилизация текста)
Семантика текста (HTML5 тема 04 - семантика текста)
Основы CSS (HTML5 тема 02 - основы CSS)
Структура HTML документа (HTML5 тема 01 - структура html документа)
Yii2
Сессии и авторизация
Rest
PHP basic
PHP Advanced
PHP and MySQL
MySQL
Push Notifications (Lecture 22 – push notifications)
RxJava+RxAndroid (Lecture 20 – rx java)
Работа с соцсетями (Lecture 19 – social)
Работа с геоданными (Lecture 18 – geolocation)
Animations (Lecture 17 – animations)
Toolbar (Lecture 16 – toolbar)

Android - 09 - Fragments

  • 2. О чем речь? • Fragment – класс, реализующий часть(фрагмент) Activity. • Позволяет: реализовать гибкий интерфейс, облегчить поддержу разных экранов, декомпозировать и упростить логику. • Всегда привязан к Activity. • Собственный жизненный цикл, привязанный к циклу Activity. Подробнее.
  • 4. Основные классы API 11+ -android.app.Fragment -android.app.FragmentManager -android.app.FragmentTransaction API 4+ via SupportLibrary -android.support.v4.app.FragmentActivity -android.support.v4.app.Fragment -android.support.v4.app.FragmentManager -android.support.v4.app.FragmentTransaction
  • 5. Жизненный цикл ● onAttach(Activity) – вызывается, когда фрагмент привязывается к Activity. С этого момента можно использовать getActivity(). ● onCreateView(LayoutInflater, ViewGroup, Bundle) – вызывается, когда фрагмент привязывается к иерархии View. ● onActivityCreated(Bundle) – вызывается, когда завершается onCreate() у Activity. ● onDestroyView() - когда иерархия View разбирается. ● onDetach() - фрагмент больше не ассоциируется с Activity. С этого момента getActivity() возвращает null.
  • 6. Базовая реализация ● onCreate(Bundle) – инициализируем все ресурсы, связанные с фрагментом, кроме UI. ● onCreateView(LayoutInflater, ViewGroup, Bundle) – создаем и возвращаем View фрагмента. Реализация этого метода не обязательна. ● onActivityCreated(Bundle savedInstanceState) – инициализируем UI, устанавливаем adapter или другие данные.
  • 7. Базовая реализация ● onResume() - инициализируем “дорогие” ресурсы: GPS, анимация, постоянное использование сети тд. ● onPause() - освобождаем “дорогие” ресурсы, сохраняем состояние. ● onDestoryView() - зануляем все ссылки на все View если мы их сохраняли.
  • 8. Добавление фрагментов 1. Тег <fragment> в layout. 2. Нельзя убрать. 3. Нельзя передавать аргументы. 4. Обязательно должен быть задан id или tag.
  • 9. Добавление фрагментов 2. В Runtime с использованием FragmentTransaction ● Fragment.setArguments(Bundle) – Передаем аргументы. ● FragmentManager.beginTransaction() - Создаем транзакцию. ● FragmentManager.executePendingTransactions() - Убеждаемся что все транзакции завершены. ● commit(), commitAllowingStateLoss() - выполняем транзакцию. ● Состояние сохраняется.
  • 10. Операции с фрагментами ●FragmentManager.findFragmentById(int) ●FragmentManager.findFragmentByTag(String) ●add(int, Fragment, String) ●remove(Fragment) ●replace(int, Fragment, String) ●hide(Fragment) ●show(Fragment) ●detach(Fragment) API 13 ●attach(Fragment) API 13 ●С фрагментами задекларированными в layout почти ничего делать нельзя.
  • 11. Backstack ●FragmentTransaction.addToBackStack(String). ●FragmentManager.popBackStack(). ●FragmentManager.getBackStackEntryCount() ●FragmentManager.getBackStackEntryAt(int) ●По возвращению из стека onCreateView(), onActivityCreated(), onStart(), and onResume(). ●Поведение FragmentActivity по умолчанию: if (!fragmentManager.popBackStackImmediate()) { finish(); }
  • 12. Сохранение состояния ●Нельзя хранить ссылки на элементы layout. ●Сохраняется в onSaveInstanceState(Bundle) ●Восстанавливается если savedState не null в onCreate(), onCreateView(), и onActivityCreated(). ●Можно переиспользовать: setRetainInstance(true).
  • 13. ●findFragment… ●Fragment.getActivity(): findViewById, get..., cast и тд. ●Interfaces. ●Fragment.setTargetFragment(Fragment, int), Fragment. getTargetRequestCode(), Fragment.getTargetFragment(). ●Events: EventBus, Intents/LocalBroadcastReceiver Fragment vs. FragmentActivity
  • 14. Наследники ●DialogFragment ●ListFragment ●PreferenceFragment нет в SupportLibrary ●WebViewFragment нет в SupportLibrary ●MapFragment из Google Services ●ViewPager + FragmentPagerAdapter
  • 15. Вложенные фрагменты API 17 ●Fragment.getChildFragmentManager() ●Fragment.getParentFragment() ●Состояние сохраняется. ●Жизненный цикл onCreateView() onDestroyView() ●Проблемы с анимацией. ●Нельзя использовать setRetainInstance(boolean) ●Да и вообще не очень...
  • 16. Делайте правильно, а не правильно - не делайте Хорошо: ● newInstance(...) ● setArguments() ● Все диалоги – фрагменты ● Хорошее разделение по смыслу: один фрагмент – одна задача. ● Сохранять состояние. ● Утилитные классы для избежания копипасты. ● ListFragment, WebViewFragment.
  • 17. Делайте правильно, а не правильно - не делайте Плохо, иногда очень: ● Отсутствие пустого конструктора. ● Забытые ссылки на элементы layout. ● Забытые вложенные анонимные классы, асинхронные задачи и тд. ● Вложенные фрагменты пересоздаются, даже если состояние родительского восстанавливается.
  • 18. Ссылки ● API Guides ● Google Fragment Training ● Fragment ● FragmentTransaction ● FragmentManager ● FragmentPagerAdapter