Android. Собеседование #5. Fragments

Автор:

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);
    }

 

Ваш адрес email не будет опубликован. Обязательные поля помечены *