Какой жизненный цикл у Fragment

Ответ

Фрагмент имеет сложный жизненный цикл с ключевыми методами:

  1. onAttach() - связь с Activity
  2. onCreate() - инициализация
  3. onCreateView() - создание UI
  4. onViewCreated() - завершение создания View
  5. onStart() - видимый, но не активный
  6. onResume() - активный и взаимодействующий
  7. onPause() - частично видимый
  8. onStop() - невидимый
  9. onDestroyView() - уничтожение View
  10. onDestroy() - очистка ресурсов
  11. onDetach() - отвязка от Activity

Пример:

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)
    // Инициализация UI элементов
}

Важно: onCreateView() вызывается каждый раз при повторном создании UI, а onCreate() - только один раз.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Смотри, фрагмент — это как отдельный кусок интерфейса, который можно впихнуть в активити. Но жизненный цикл у него, бля, сложнее, чем у средневекового алхимика. Прямо хитрая жопа, а не компонент.

Вот смотри, как он пляшет:

  1. onAttach() — фрагмент пристёгивается к активити. Типа «здарова, родитель, я твой!».
  2. onCreate() — тут он инициализируется. Без интерфейса ещё, зато уже с Bundle (если его сохранили). Вызывается один раз, запомни это, а то потом сам от себя охуеешь.
  3. onCreateView() — а вот тут он уже надувает свою верстку из XML. Возвращает корневую View. Это как раз тот метод, где ты пишешь return inflater.inflate(R.layout.fragment_example, container, false). Важный момент: этот метод могут вызывать несколько раз, если фрагмент пересоздают!
  4. onViewCreated() — вьюха создана, можно наконец найти все TextView и Button по id и повесить клик-листенеры. Удобное место, чтоб не городить всё в onCreateView.
  5. onStart() — фрагмент становится видимым. Но это ещё не всё.
  6. onResume() — вот теперь всё, пользователь может с ним взаимодействовать. Активность — полная.
  7. onPause() — что-то его перекрыло (другой фрагмент поверх вылез). Частично видим, но уже не в фокусе.
  8. onStop() — фрагмент вообще не видно. Спрятался.
  9. onDestroyView() — вьюха фрагмента уничтожается, но сам объект ещё жив. Все ссылки на элементы интерфейса надо занулять тут, а то будет утечка памяти — доверия ебать ноль к системе.
  10. onDestroy() — финальная очистка. Прощай, жестокий мир.
  11. onDetach() — и окончательно отстыковывается от активити. Свободен!

Вот тебе пример кода, его не трогаем, он святой:

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)
    // Инициализация UI элементов
}

Запомни главную фишку, а то будет вам хиросима и нигерсраки: onCreate() вызывается один раз за жизнь фрагмента, а onCreateView() — может вызываться при каждом пересоздании его интерфейса. Если будешь в onCreateView бизнес-логику пихать или тяжёлые операции — получишь терпения ноль ебать у пользователя. Всё тяжёлое — в onCreate() или во ViewModel.