Что такое фрагменты и их жизненный цикл?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Фрагменты (Fragments) в Android
Фрагменты — это компоненты приложения, которые представляют собой повторно используемую часть пользовательского интерфейса (UI) и логики. Они действуют внутри активности (Activity), подобно "под-активности", и позволяют создавать модульные, адаптивные интерфейсы, особенно для планшетов, складных устройств и многоконтейнерных макетов.
Ключевые особенности:
- Живут внутри Activity: Не имеют собственного контекста, используют контекст активности-хоста.
- Имеют собственный жизненный цикл, но зависят от жизненного цикла родительской активности.
- Могут добавляться, удаляться, заменяться динамически во время выполнения (transactions).
- Позволяют повторно использовать UI-логику в разных активностях.
Жизненный цикл фрагмента
Жизненный цикл фрагмента включает 11 состояний и 7 основных колбэков, более сложный, чем у Activity, из-за зависимости от родительской активности и возможности динамического управления.
Основные методы жизненного цикла:
- onAttach() — фрагмент связывается с активностью. Здесь можно получить ссылку на активность.
- onCreate() — инициализация основных компонентов фрагмента (без UI).
- onCreateView() — создание и возврат иерархии View фрагмента (инфлейт layout).
- onViewCreated() — View создана, можно настраивать элементы (например, RecyclerView).
- onActivityCreated() — активность создана, её View иерархия готова (устарел с API 29).
- onStart() — фрагмент становится видимым.
- onResume() — фрагмент активен и готов к взаимодействию.
- onPause() — фрагмент частично скрыт (например, диалог поверх).
- onStop() — фрагмент полностью невидим.
- onDestroyView() — View иерархия уничтожается, но сам фрагмент живёт.
- onDestroy() — окончательная очистка ресурсов.
- onDetach() — фрагмент отсоединяется от активности.
Графическое представление:
onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → [Активное состояние] → onPause → onStop → onDestroyView → onDestroy → onDetach
Пример базового фрагмента:
class ExampleFragment : Fragment() {
override fun onAttach(context: Context) {
super.onAttach(context)
// Связь с активностью
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Инициализация данных
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Инфлейт макета
return inflater.inflate(R.layout.fragment_example, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Настройка View элементов
val textView = view.findViewById<TextView>(R.id.text_view)
textView.text = "Фрагмент создан"
}
override fun onDestroyView() {
// Очистка ссылок на View для избежания утечек памяти
super.onDestroyView()
}
}
Особенности и важные аспекты
Состояния фрагмента:
- CREATED — после onCreate(), но до onCreateView()
- VIEW_CREATED — после onCreateView()
- STARTED — после onStart()
- RESUMED — после onResume() (активное состояние)
Взаимосвязь с Activity:
- Если активность остановлена (onStop()), фрагмент также получает onStop().
- При повороте экрана фрагмент уничтожается и создаётся заново (если не использовать setRetainInstance(true) для фрагментов без UI).
Back Stack фрагментов:
При замене фрагментов можно добавить транзакцию в стек возврата:
supportFragmentManager
.beginTransaction()
.replace(R.id.container, NewFragment())
.addToBackStack("fragment_tag")
.commit()
Коммуникация между фрагментами:
- Через общую ViewModel (рекомендовано).
- Через родительскую Activity как посредник.
- Используя Интерфейсы (callback'и).
Фрагменты значительно упрощают создание адаптивных интерфейсов, но требуют аккуратного управления жизненным циклом во избежание утечек памяти и непредсказуемого поведения, особенно при работе с FragmentManager и транзакциями.