2. О чем речь?
• Fragment – класс, реализующий часть(фрагмент)
Activity.
• Позволяет: реализовать гибкий интерфейс,
облегчить поддержу разных экранов,
декомпозировать и упростить логику.
• Всегда привязан к Activity.
• Собственный жизненный цикл, привязанный к циклу
Activity. Подробнее.
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() - выполняем транзакцию.
● Состояние сохраняется.
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
16. Делайте правильно, а не
правильно - не делайте
Хорошо:
● newInstance(...)
● setArguments()
● Все диалоги – фрагменты
● Хорошее разделение по смыслу: один фрагмент – одна задача.
● Сохранять состояние.
● Утилитные классы для избежания копипасты.
● ListFragment, WebViewFragment.
17. Делайте правильно, а не
правильно - не делайте
Плохо, иногда очень:
● Отсутствие пустого конструктора.
● Забытые ссылки на элементы layout.
● Забытые вложенные анонимные классы, асинхронные задачи и тд.
● Вложенные фрагменты пересоздаются, даже если состояние родительского
восстанавливается.
18. Ссылки
● API Guides
● Google Fragment Training
● Fragment
● FragmentTransaction
● FragmentManager
● FragmentPagerAdapter