android - 09 - fragments
DESCRIPTION
Introduction to Fragments APITRANSCRIPT
![Page 1: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/1.jpg)
Fragments
Жилич Роман
Android Internship 2014
![Page 2: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/2.jpg)
О чем речь?
• Fragment – класс, реализующий часть(фрагмент) Activity.
• Позволяет: реализовать гибкий интерфейс, облегчить поддержу разных экранов, декомпозировать и упростить логику.
• Всегда привязан к Activity.• Собственный жизненный цикл, привязанный к циклу
Activity. Подробнее.
![Page 3: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/3.jpg)
На картинках все просто
![Page 4: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/4.jpg)
Основные классы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
![Page 5: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/5.jpg)
Жизненный цикл
● onAttach(Activity) – вызывается, когда фрагмент привязывается к Activity. С этого момента можно использовать getActivity().
● onCreateView(LayoutInflater, ViewGroup, Bundle) – вызывается, когда фрагмент привязывается к иерархии View.
● onActivityCreated(Bundle) – вызывается, когда завершается onCreate() у Activity.
● onDestroyView() - когда иерархия View разбирается.
● onDetach() - фрагмент больше не ассоциируется с Activity. С этого момента getActivity() возвращает null.
![Page 6: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/6.jpg)
Базовая реализация
● onCreate(Bundle) – инициализируем все ресурсы, связанные с фрагментом, кроме UI.
● onCreateView(LayoutInflater, ViewGroup, Bundle) – создаем и возвращаем View фрагмента. Реализация этого метода не обязательна.
● onActivityCreated(Bundle savedInstanceState) – инициализируем UI, устанавливаем adapter или другие данные.
![Page 7: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/7.jpg)
Базовая реализация
● onResume() - инициализируем “дорогие” ресурсы: GPS, анимация, постоянное использование сети тд.
● onPause() - освобождаем “дорогие” ресурсы, сохраняем состояние.
● onDestoryView() - зануляем все ссылки на все View если мы их сохраняли.
![Page 8: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/8.jpg)
Добавление фрагментов
1. Тег <fragment> в layout.
2. Нельзя убрать.
3. Нельзя передавать аргументы.
4. Обязательно должен быть задан id или tag.
![Page 9: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/9.jpg)
Добавление фрагментов
2. В Runtime с использованием FragmentTransaction
● Fragment.setArguments(Bundle) – Передаем аргументы.
● FragmentManager.beginTransaction() - Создаем транзакцию.
● FragmentManager.executePendingTransactions() - Убеждаемся что все транзакции завершены.
● commit(), commitAllowingStateLoss() - выполняем транзакцию.
● Состояние сохраняется.
![Page 10: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/10.jpg)
Операции с фрагментами
●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 почти ничего делать нельзя.
![Page 11: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/11.jpg)
Backstack
●FragmentTransaction.addToBackStack(String).●FragmentManager.popBackStack().●FragmentManager.getBackStackEntryCount()●FragmentManager.getBackStackEntryAt(int)●По возвращению из стека onCreateView(), onActivityCreated(), onStart(), and onResume().●Поведение FragmentActivity по умолчанию:
if (!fragmentManager.popBackStackImmediate()) {
finish();
}
![Page 12: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/12.jpg)
Сохранение состояния●Нельзя хранить ссылки на элементы layout.
●Сохраняется в onSaveInstanceState(Bundle)
●Восстанавливается если savedState не null в onCreate(), onCreateView(), и onActivityCreated().
●Можно переиспользовать: setRetainInstance(true).
![Page 13: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/13.jpg)
●findFragment…
●Fragment.getActivity(): findViewById, get..., cast и тд.
●Interfaces.
●Fragment.setTargetFragment(Fragment, int), Fragment.getTargetRequestCode(), Fragment.getTargetFragment().
●Events: EventBus, Intents/LocalBroadcastReceiver
Fragment vs. Fragment\Activity
![Page 14: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/14.jpg)
Наследники
●DialogFragment●ListFragment●PreferenceFragment нет в SupportLibrary●WebViewFragment нет в SupportLibrary●MapFragment из Google Services
●ViewPager + FragmentPagerAdapter
![Page 15: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/15.jpg)
Вложенные фрагменты
API 17
●Fragment.getChildFragmentManager()●Fragment.getParentFragment()●Состояние сохраняется. ●Жизненный цикл onCreateView() onDestroyView()●Проблемы с анимацией.●Нельзя использовать setRetainInstance(boolean)●Да и вообще не очень...
![Page 16: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/16.jpg)
Делайте правильно, а не правильно - не делайте
Хорошо:
● newInstance(...)● setArguments()● Все диалоги – фрагменты● Хорошее разделение по смыслу: один фрагмент – одна задача.● Сохранять состояние.● Утилитные классы для избежания копипасты.● ListFragment, WebViewFragment.
![Page 17: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/17.jpg)
Делайте правильно, а не правильно - не делайте
Плохо, иногда очень:
● Отсутствие пустого конструктора.
● Забытые ссылки на элементы layout.
● Забытые вложенные анонимные классы, асинхронные задачи и тд.
● Вложенные фрагменты пересоздаются, даже если состояние родительского восстанавливается.
![Page 18: Android - 09 - Fragments](https://reader033.vdocuments.mx/reader033/viewer/2022051212/557b8536d8b42a62418b47ea/html5/thumbnails/18.jpg)
Ссылки
● API Guides
● Google Fragment Training
● Fragment
● FragmentTransaction
● FragmentManager
● FragmentPagerAdapter