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

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

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

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

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

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

Общий вызов методов при FragmentTransaction.add()

При добавлении нового фрагмента в контейнер с помощью метода FragmentTransaction.add(), последовательность вызовов методов жизненного цикла зависит от состояния Activity-хозяина и видимости добавляемого фрагмента. Рассмотрим наиболее распространённый сценарий, когда Activity уже находится в состоянии RESUMED (активно и видимо), а контейнер пуст.

Последовательность вызовов для нового фрагмента

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

Пример кода и вывод в Logcat

Рассмотрим простой фрагмент и его добавление:

// MyFragment.kt
class MyFragment : Fragment() {
    override fun onAttach(context: Context) {
        super.onAttach(context)
        Log.d("LIFECYCLE", "MyFragment: onAttach")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("LIFECYCLE", "MyFragment: onCreate")
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.d("LIFECYCLE", "MyFragment: onCreateView")
        return inflater.inflate(R.layout.fragment_my, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.d("LIFECYCLE", "MyFragment: onViewCreated")
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        Log.d("LIFECYCLE", "MyFragment: onActivityCreated")
    }

    override fun onStart() {
        super.onStart()
        Log.d("LIFECYCLE", "MyFragment: onStart")
    }

    override fun onResume() {
        super.onResume()
        Log.d("LIFECYCLE", "MyFragment: onResume")
    }
}

Добавление в активной Activity:

// MainActivity.kt
supportFragmentManager.beginTransaction()
    .add(R.id.fragment_container, MyFragment())
    .commit()

Вывод в Logcat:

MyFragment: onAttach
MyFragment: onCreate
MyFragment: onCreateView
MyFragment: onViewCreated
MyFragment: onActivityCreated
MyFragment: onStart
MyFragment: onResume

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

  • Состояние Activity: Если Activity сама ещё не прошла onStart(), фрагмент будет остановлен на соответствующем методе. Например, если добавить фрагмент в onCreate() Activity до вызова super.onCreate(), то цепочка вызовов фрагмента дойдёт только до onActivityCreated(), а onStart() и onResume() будут вызваны следом за одноимёнными методами Activity.
  • Метод add() vs replace(): При add() новый фрагмент помещается поверх существующих (если они есть), и их жизненные циклы не затрагиваются, пока не будет вызван replace() или явное удаление. Старый фрагмент останется в состоянии onPause()/onStop(), если он перекрыт новым.
  • Аргумент savedInstanceState: В onCreate() и onCreateView() он будет null, так как фрагмент создаётся впервые. Он не-null только при восстановлении состояния (например, после поворота экрана).
  • Back Stack: Если транзакция добавлена в back stack (addToBackStack(null)), то при нажатии "Назад" фрагмент будет уничтожен, вызвав обратную цепочку: onPause()onStop()onDestroyView() → ... → onDetach().

Итог: Метод add() инициирует полную цепочку "рождения" фрагмента от присоединения к контексту (onAttach) до полной активности (onResume), при условии, что хост-активность уже находится в состоянии RESUMED. Понимание этой последовательности критично для правильной инициализации данных, подписок на события и управления ресурсами во фрагменте.