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

Какие методы у Activity вызываются при замене одного Fragment на другой?

2.0 Middle🔥 111 комментариев
#Жизненный цикл и навигация

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

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

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

Жизненный цикл Activity при замене Fragment

При замене одного Fragment на другой в Activity вызывается последовательность методов жизненного цикла, затрагивающая как уходящий, так и добавляемый фрагмент, а также саму Activity. Этот процесс управляется FragmentManager и зависит от использования back stack.

Ключевые методы Activity

Самой Activity при замене фрагмента не требуется пересоздание, поэтому её методы жизненного цикла (onCreate, onStart, onResume) не вызываются. Однако её колбэки управления фрагментами могут быть задействованы:

  1. onAttachFragment() — вызывается, когда фрагмент привязывается к Activity. Может быть полезен для получения ссылки на фрагмент из Activity.

    override fun onAttachFragment(fragment: Fragment) {
        super.onAttachFragment(fragment)
        if (fragment is MyFragment) {
            // Можно установить взаимодействие с фрагментом
        }
    }
    
  2. onBackPressed() или OnBackPressedDispatcher — актуальны, если замена происходит с добавлением в стек возврата (back stack). Activity обрабатывает нажатие кнопки "Назад", чтобы вернуть предыдущий фрагмент.

Полный процесс замены фрагмента

Рассмотрим типичный сценарий с использованием FragmentTransaction.replace() с добавлением в back stack:

supportFragmentManager.commit {
    replace(R.id.fragment_container, NewFragment())
    addToBackStack("transaction_name")
}

Для уходящего фрагмента (OldFragment):

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

Для добавляемого фрагмента (NewFragment):

  1. onAttach() — фрагмент привязывается к Context (обычно к Activity).
  2. onCreate() — инициализация ключевых компонентов (без UI).
  3. onCreateView() — создание и возврат иерархии View.
  4. onViewCreated() — идеальное место для настройки View (биндинг, установка слушателей).
  5. onActivityCreated() — устаревший метод (в API уровня 28+), сообщает, что Activity.onCreate() завершён.
  6. onStart() — фрагмент становится видимым.
  7. onResume() — фрагмент становится активным и интерактивным.

Важные нюансы

  • Без back stack: Если замена выполняется без addToBackStack(), уходящий фрагмент будет полностью уничтожен (вызовутся onDestroy() и onDetach()).

  • С back stack: Уходящий фрагмент останавливается на onDestroyView(), его экземпляр сохраняется в памяти. При возврате через кнопку "Назад" он пройдёт onCreateView() -> onViewCreated() -> onStart() -> onResume().

  • Метод onSaveInstanceState(): Вызывается у Activity и фрагментов перед onStop() для сохранения временных данных, если система может уничтожить процесс. Не путать с постоянным хранением данных.

  • View Lifecycle: Для корректной работы с LiveData, ViewBinding или DataBinding важно очищать ссылки в onDestroyView():

    class MyFragment : Fragment() {
        private var _binding: FragmentMyBinding? = null
        private val binding get() = _binding!!
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
            _binding = FragmentMyBinding.inflate(inflater, container, false)
            return binding.root
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null // Предотвращаем утечку памяти
        }
    }
    

Роль FragmentManager

FragmentManager — центральный компонент, который:

  • Выполняет транзакции (добавление, замена, удаление).
  • Управляет back stack.
  • Находит фрагменты по тегу или ID.
  • Отслеживает изменения жизненного цикла фрагментов.

Понимание этого процесса позволяет избегать распространённых ошибок: утечек памяти из-за удержания ссылок на View, потери состояния UI и некорректного взаимодействия между фрагментами. Всегда учитывайте, сохраняется ли фрагмент в back stack, так как это напрямую влияет на его жизненный цикл.