Какой жизненный цикл у фрагмента?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Жизненный цикл фрагмента
Фрагмент — это переиспользуемый компонент в Activity с собственным жизненным циклом. Понимание этого критически важно для правильной работы с памятью и состоянием.
Основные этапы
onAttach() — Фрагмент присоединен к Activity
onCreate() — Инициализация, создание переменных
onCreateView() — Создание UI (return View)
onViewCreated() — View создана, инициализируем UI
onStart() — Фрагмент виден
onResume() — Фрагмент получает фокус (может принимать input)
onPause() — Фрагмент теряет фокус (но видим)
onStop() — Фрагмент невидим
onDestroyView() — Удаляем ссылки на View
onDestroy() — Удаляем ресурсы
onDetach() — Отсоединение от Activity
Практический пример
class UserFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_user, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val nameTextView: TextView = view.findViewById(R.id.name)
nameTextView.text = "User Name"
}
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}
Подписка на LiveData с viewLifecycleOwner
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.user.observe(viewLifecycleOwner) { user ->
updateUI(user)
}
}
Критические правила
1. Используй viewLifecycleOwner для observe
Правильно: viewModel.data.observe(viewLifecycleOwner) { ... }
Неправильно: viewModel.data.observe(this) { ... } — утечка памяти
2. Освобождай ресурсы в onDestroyView()
View может быть пересоздана при повороте экрана. Всегда очищай ссылки.
3. Никогда не обращайся к Activity в onCreate()
Activity еще может не существовать. Используй onAttach() вместо этого.
ViewBinding правильно
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
}
}
Сохранение состояния
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("user_name", currentUserName)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val userName = savedInstanceState?.getString("user_name")
}
Ключевые моменты
- Fragment может пережить Activity при пересоздании
- onCreateView может быть вызван несколько раз
- Всегда очищай ресурсы в onDestroyView() и onDestroy()
- Используй viewLifecycleOwner для UI операций
- Никогда не обращайся к Activity напрямую
Понимание этого цикла — основа memory-safe приложений.