← Назад к вопросам

Какие методы ЖЦ Fragment вызовутся при добавлении нового через метод replace?

1.0 Junior🔥 201 комментариев
#Android компоненты#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

При добавлении нового Fragment через метод replace() в Android, жизненный цикл (Lifecycle) обоих фрагментов — заменяемого (старого) и добавляемого (нового) — проходит через последовательность вызовов специфических методов. Важно понимать, что replace() фактически удаляет старый фрагмент из контейнера (если он там существовал) и добавляет новый, что влияет на их состояния.

Жизненный цикл заменяемого (старого) Fragment

Когда вызывается FragmentTransaction.replace(), для существующего фрагмента в контейнере начинается процесс удаления. Вызовы методов происходят в следующем порядке (при условии, что транзакция совершается и commit() выполняется):

  1. onPause() — фрагмент перестает быть активным для пользователя.
  2. onStop() — фрагмент полностью скрывается (если его контейнер, например Activity, также останавливается или фрагмент полностью заменяется).
  3. onDestroyView() — уничтожается View (разметка) фрагмента. Это ключевой момент, потому что replace() удаляет view старого фрагмента из контейнера.
  4. onDestroy() — фрагмент уничтожается (если он не будет сохранен в backstack).
  5. onDetach() — фрагмент окончательно отделяется от своей Activity.

Если старый фрагмент добавлен в backstack (через addToBackStack()), то вместо полного уничтожения происходит следующее:

  • onDestroyView() и onDetach() не вызываются сразу.
  • Фрагмент остается в "восстановляемом" состоянии: его экземпляр сохраняется, но view уничтожается (onDestroyView() вызывается). Методы onDestroy() и onDetach() будут вызваны позже, когда фрагмент окончательно удалится из backstack (например, при навигации назад или полном очищении стека).

Жизненный цикл добавляемого (нового) Fragment

Новый фрагмент проходит стандартную последовательность добавления:

  1. onAttach() — фрагмент присоединяется к Activity.
  2. onCreate() — инициализация фрагмента (без создания view).
  3. onCreateView() — создание и возвращение View фрагмента. Это особенно важно при replace(), потому что контейнер теперь будет отображать эту новую view.
  4. onViewCreated() — view уже создана, можно инициализировать ее элементы (например, TextView, Button).
  5. onActivityCreated() (устаревший, но может вызываться в некоторых версиях) — указывает, что Activity завершила свое onCreate().
  6. onStart() — фрагмент становится видимым (совпадает с onStart() Activity или когда контейнер начинает отображение).
  7. onResume() — фрагмент становится активным и готов к взаимодействию с пользователем.

Пример кода и последовательность

Рассмотрим типичный сценарий в Activity:

supportFragmentManager.beginTransaction()
    .replace(R.id.fragment_container, NewFragment()) // Старый FragmentA заменяется на NewFragment
    .addToBackStack("transaction_name")
    .commit()

После commit() (или commitNow()), предположим, что FragmentA был в контейнере:

Последовательность вызовов (общая):

  • Для FragmentA (старый): onPause() -> onStop() -> onDestroyView(). Если не в backstack, далее: onDestroy() -> onDetach().
  • Для NewFragment (новый): onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume().

Если FragmentA добавлен в backstack, после onDestroyView() он остается в состоянии между onDestroy() и onDetach() — его экземпляр жив, но view уничтожена.

Ключевые моменты и влияние addToBackStack()

  • replace() без addToBackStack(): старый фрагмент полностью уничтожается (вызываются все методы до onDetach()). Новый фрагмент создается и запускается.
  • replace() с addToBackStack(): старый фрагмент сохраняет свой экземпляр (не вызываются onDestroy() и onDetach()), но его view уничтожается (onDestroyView()). Это позволяет восстановить фрагмент позже при pop из backstack — тогда будет вызван onCreateView() и последующие методы для повторного создания view.
  • Методы onSaveInstanceState() могут вызываться для старого фрагмента перед onDestroyView() (если система сохраняет состояние, например, при повороте экрана или уничтожении Activity), но не напрямую из-за replace().
  • onViewStateRestored() вызывается для нового фрагмента после onActivityCreated() (или в современных версиях после onViewCreated()), если есть восстановленное состояние view.

Таким образом, метод replace() запускает сложный процесс перехода между состояниями двух фрагментов, где ключевую роль играет onDestroyView() для старого и onCreateView() для нового. Использование backstack изменяет глубину разрушения старого фрагмента, сохраняя его для возможной будущей навигации.

Какие методы ЖЦ Fragment вызовутся при добавлении нового через метод replace? | PrepBro