Fragment: что это такое, фрагменты и FragmentManager в Android

Автор: IT Sectr Опубликовано: 2026-02-22 Время чтения: 7 мин

Fragment — переиспользуемый компонент UI в Android, который встраивается в Activity и управляется через FragmentManager. Каждый фрагмент имеет собственный жизненный цикл, layout и состояние. Fragment упрощает адаптацию под разные размеры экрана и повторное использование кода. Подробнее читайте в официальном руководстве Google.

Главное

  • Fragment — компонент UI внутри Activity с собственным жизненным циклом и layout
  • FragmentManager — класс для управления транзакциями фрагментов и back stack
  • FragmentTransaction — атомарная операция добавления, замены или удаления фрагментов
  • Jetpack Fragment — библиотека для обратной совместимости до Android 1.6 (API 4)
  • ViewModel — общий компонент для обмена данными между фрагментами в одном Activity

Что такое Fragment?

Fragment — модульный компонент пользовательского интерфейса Android, который представляет часть экрана внутри Activity. Fragment может управлять собственным layout, обрабатывать события жизненного цикла и сохранять своё состояние. Благодаря модульности один фрагмент можно использовать в разных Activity и на разных устройствах.

Fragment API появился в Android 3.0 (Honeycomb, API 11) 2011 года для поддержки планшетов. До этого разработчикам приходилось создавать отдельные Activity для телефона и планшета. Fragment позволил собирать экран из независимых блоков. В 2019 году Google выпустила Jetpack Fragment library с обратной совместимостью до API 4.

По данным Google (2026), 80% приложений в Google Play используют Fragment в той или иной форме. Jetpack Fragment library загружена более 10 миллиардов раз через Google Play Services. Fragment остаётся ключевым компонентом Android-архитектуры даже в эпоху Jetpack Compose.

Жизненный цикл Fragment

Жизненный цикл Fragment сложнее, чем у Activity, поскольку он зависит от состояния Activity-хоста. Fragment проходит через те же состояния, что и Activity, но добавляет собственные колбэки: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Колбэк FragmentСоответствие ActivityНазначение
onAttachдо onCreateFragment привязан к Activity
onCreateonCreateИнициализация данных, не связанных с UI
onCreateViewonCreateСоздание layout через inflater
onViewCreatedonCreateСвязывание элементов UI после создания view
onDestroyViewonDestroyУдаление view, освобождение ресурсов UI
onDetachonDestroyFragment отвязан от Activity

Сравнение Lifecycle Fragment и Activity

Главное отличие жизненного цикла Fragment — вызов onCreateView и onDestroyView между onCreate и onDestroy. Fragment может существовать без UI (если onCreateView возвращает null). После пересоздания Activity FragmentManager восстанавливает фрагменты автоматически.

FragmentManager и транзакции

FragmentManager — центральный класс для управления фрагментами в Activity. Он отвечает за добавление, удаление, замену фрагментов, управление back stack и восстановление состояния. FragmentManager доступен через supportFragmentManager (AndroidX) или fragmentManager (старый API).

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Если фрагмент ещё не добавлен — создаём
        if (savedInstanceState == null) {
            val transaction = this.supportFragmentManager
                .beginTransaction()
            transaction.add(R.id.fragment_container, ListFragment())
            transaction.addToBackStack(null)
            transaction.commit()
        }
    }

    fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit()
    }
}

Транзакции FragmentTransaction — атомарны. commit() планирует выполнение на следующий цикл Looper. Для немедленного выполнения используйте commitNow(). addToBackStack(null) добавляет транзакцию в стек назад — кнопка «Назад» отменит операцию.

Методы жизненного цикла Fragment

Рассмотрим ключевые методы жизненного цикла Fragment с примером на Kotlin. onCreateView создаёт layout — в отличие от Activity метод должен вернуть View. onViewCreated вызывается сразу после, здесь безопасно находить элементы по id. onDestroyView — последний момент для очистки ссылок на view.

kotlin
class DetailFragment : Fragment() {

    private var _binding: FragmentDetailBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentDetailBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.textTitle.setText("Детали")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Паттерн View Binding с _binding/binding гарантирует, что после onDestroyView ссылка на layout обнуляется. Обращение к binding после уничтожения view вызовет NullPointerException. Этот паттерн рекомендован Google для всех фрагментов.

Передача данных между фрагментами

Для передачи данных между фрагментами Android предлагает несколько механизмов. Самый надёжный — общий ViewModel, разделяемый между фрагментами одного Activity. Fragment Result API подходит для разовых событий. Аргументы Bundle — для данных при создании фрагмента.

kotlin
// Общий ViewModel для двух фрагментов
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

    fun select(item: Item) { _selectedItem.setValue(item) }
}

// Фрагмент A: отправляет событие через Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))

// Фрагмент B: получает событие
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Fragment Result API (добавлен в Fragment 1.3.0) заменяет устаревшие setTargetFragment/onActivityResult. API типобезопасен, использует Bundle и не требует знания о получателе. Parent FragmentManager выступает посредником между фрагментами.

Fragment vs Activity: когда что выбрать

Выбор между Fragment и Activity зависит от архитектуры приложения. Fragment обязателен для адаптивных макетов (телефон + планшет), для кастомной анимации переходов и для использования Jetpack Navigation. Activity предпочтительнее для простых приложений с одним-двумя экранами.

КритерийFragmentActivity
Скорость созданияБыстрее (лёгкий компонент)Медленнее (системный процесс)
Повторное использованиеВысокое (один фрагмент в разных Activity)Низкое (каждый экран — своё Activity)
Анимация переходовГибкая (FragmentTransaction)Ограниченная (overridePendingTransition)
Сохранение при поворотеАвтоматическое (менеджер восстанавливает)Ручное (onSaveInstanceState)
Deep LinksЧерез Navigation ComponentНативная поддержка через intent-filter

Jetpack Fragment и Jetpack Navigation

Современный подход к работе с Fragment — Jetpack Navigation Component, который заменяет ручное управление FragmentManager. Библиотека предоставляет NavGraph (XML-граф навигации), NavHostFragment и Safe Args для типобезопасной передачи данных.

Jetpack Fragment library (androidx.fragment:fragment-ktx) включает FragmentResult API, DialogFragment, BottomSheetDialogFragment и интеграцию с Lifecycle-aware компонентами. С 2026 года Google рекомендует использовать Fragment только через Jetpack Navigation, а не напрямую.

xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:startDestination="@+id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name=".ListFragment"
        android:label="Список">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Детали" />
</navigation>

Часто задаваемые вопросы

FragmentManager — что это?

FragmentManager — класс, управляющий транзакциями фрагментов. Он добавляет, удаляет, заменяет фрагменты в контейнере Activity. FragmentManager восстанавливает состояние фрагментов при пересоздании Activity и управляет back stack.

Чем Fragment отличается от Activity?

Fragment — часть UI внутри Activity, не может существовать самостоятельно. Fragment переживает пересоздание Activity при повороте экрана. Activity — полноценный экран с собственным Lifecycle, Fragment зависит от Lifecycle Activity.

Когда использовать Fragment вместо Activity?

Fragment — когда экран состоит из нескольких независимых блоков (табс, мастер-детейл, адаптация под планшет). Activity — когда экран не имеет повторяющихся блоков. Google рекомендует Single Activity + множество Fragment.

Как передать данные между Fragment?

Три способа: через родительское Activity (общий ViewModel), через Fragment Result API (setFragmentResult), через аргументы Bundle при создании Fragment. ViewModel — предпочтительный способ, так как данные сохраняются при пересоздании.

Что такое Fragment Transaction?

Fragment Transaction — атомарная операция изменения набора фрагментов. FragmentManager.beginTransaction() открывает транзакцию, в которой можно вызвать add, remove, replace, hide, show. Каждая транзакция завершается commit() или commitNow().

Итоги

  • Fragment — переиспользуемый компонент UI внутри Activity с собственным жизненным циклом, макетом и состоянием
  • FragmentManager управляет транзакциями фрагментов и восстанавливает их состояние при пересоздании Activity
  • FragmentTransaction — атомарная операция для добавления, замены, удаления и скрытия фрагментов
  • Жизненный цикл Fragment включает шесть колбэков, от onAttach до onDetach, с дополнительной точкой onCreateView
  • ViewModel — рекомендуемый способ обмена данными между фрагментами в одном Activity
  • Fragment Result API обеспечивает типобезопасную передачу разовых событий между фрагментами

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также