1. Что такое Fragment?
Fragment представляет собой часть пользовательского интерфейса, который находится внутри Activity. Fragment имеет свой жизненный цикл и самостоятельно обрабатывает события ввода. В Activity одновременно может находиться несколько фрагментов.
Жизненный цикл фрагмента выглядит следующим образом:
– onAttach()
Вызывается, когда Fragment связывается со своей Activity, при этом элементы не инициализированы до конца. Можно использовать для получения ссылки для Activity и последующей работы с ней.
– onCreate()
Вызывается при создании фрагмента. В методе можно инициализировать компоненты, которые необходимы для работы фрагмента, но не связанные с пользовательским интерфейсом.
– onCreateView()
Фрагмент готов для инициализации пользовательского интерфейса. В данном методе необходимо указать R.layout.xxx, который содержит интерфейс фрагмента.
– onActivityCreated()
Вызывается после полной инициализации фрагмента и его родительской Activity. С текущего момента можно обращаться к объекту Context.
– onStart()
Переводит наш Fragment в состояние Started, после чего он становится виден для пользователя. Метод может использоваться для какой-либо логики, которая взаимодействует с UI.
– onResume()
Fragment становится доступен для взаимодействия с пользователем.
– onPause()
Метод вызывается когда пользователь покинул Fragment, например перешёл на другой фрагмент, либо закрыл родительскую Factivity.
– onStop()
Fragment переходит в состояние Stopped.
– onDestroyView()
Интерфейс Fragment уничтожается.
– onDestroy()
Вызывается для выполнения окончательного удаления Fragment из системы. Android не гарантирует вызов данного метода.
2. Как добавить Fragment к Activity?
Для добавления/удаления/замены Fragment в Activity необходимо воспользоваться классами FragmentManager и FragmentTransaction.
FragmentManager fragmentManager = getSupportFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Замечу, что getFragmentManager() является deprecated методом, необходимо использовать getSupportFragmentManager() из пакета android.support.v4.app.
После создания необходимых объектов, необходимо вставить наш Fragment в xml разметку нашей Activity.
StackOfSkills fragment = new StackOfSkills(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();
В нашей разметке находится контейнер R.id.fragment_container, который будет содержать Fragment
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/fragment_container" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </android.support.constraint.ConstraintLayout>
3. Как гарантированно добавить Fragment к Activity?
При выполнении транзакции и добавлении Fragment к Activity можно использовать асинхронный метод commit(). При передаче данных в Fragment, например отправка Broadcast или через EventBus, нет гарантии, что Fragment получит их. Гарантированную доставку данных в Fragment можно обеспечить путём использования метода commitNow() который вызывается синхронно.
4. Предназначение методов add, remove, hide, show, replace?
– add()
Добавляет Fragment в контейнер и отображает его UI, если метод onCreateView() возвращает не null.
– remove()
Удаляет существующий Fragment и его UI из контейнера, к которому он был добавлен.
– hide()
Если Fragment был добавлен к контейнеру, то метод скрывает его UI, при этом Fragment не уничтожается. Применимо только к Fragment находящемся в контейнере.
– show()
Делает Fragment видимым, который был скрыт методом hide(). Применимо только к Fragment находящемся в контейнере.
– replace()
Заменяет Fragment, которой был добавлен в контейнер, другим Fragment. Метод работает по принципу вызова remove() и затем add().
5. Как сохранить данные в Fragment при повороте экрана (изменении конфигурации)?
Fragment содержит переменную, отвечающую за сохранение экземпляра Fragment во время изменения конфигурации. По умолчанию она равна false.
Для сохранения данных, в классе Fragment необходимо установить значение в true:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); }