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

Порівняння життєвого циклу 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
Швидкість створенняШвидше (легкий компонент)Повільніше (системний процес)
Повторне використанняВисоке (один Fragment в різних 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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