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

Какой жизненный цикл у фрагмента?

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

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Жизненный цикл фрагмента

Фрагмент — это переиспользуемый компонент в 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 приложений.

Какой жизненный цикл у фрагмента? | PrepBro