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).
15. Вложенные фрагменты API 17
Fragment.getChildFragmentManager()
Fragment.getParentFragment()
Состояние сохраняется.
Жизненный цикл onCreateView() onDestroyView()
Не умеет в Backstack.
Нельзя использовать setRetainInstance(boolean)
Проблемы с анимацией.
Да и вообще не очень...
Подробнее
16. Делайте правильно, а не правильно - не делайте.
Хорошо:
newInstance(...)
setArguments()
Все диалоги – фрагменты
Хорошее разделение по смыслу: один фрагмент – одна задача.
Сохранять состояние.
Утилитные классы для избежания копипасты.
17. Делайте правильно, а не правильно - не делайте.
Плохо, иногда очень:
Отсутствие пустого конструктора.
Забытые ссылки на элементы layout.
Забытые вложенные анонимные классы, асинхронные задачи и тд.
Вложенные фрагменты пересоздаются, даже если состояние родительского
восстанавливается.