Fragment: co to jest, fragmenty i FragmentManager w Androidzie

Autor: IT Sectr Opublikowano: 2026-02-22 Czas czytania: 7 min

Fragment — wielokrotnego użytku komponent UI w Androidzie, który jest osadzany w Activity i zarządzany przez FragmentManager. Każdy fragment ma własny cykl życia, layout i stan. Fragment ułatwia adaptację do różnych rozmiarów ekranu i ponowne wykorzystanie kodu. Więcej informacji znajdziesz w oficjalnym przewodniku Google.

Najważniejsze

  • Fragment — komponent UI wewnątrz Activity z własnym cyklem życia i layoutem
  • FragmentManager — klasa do zarządzania transakcjami fragmentów i back stack
  • FragmentTransaction — atomowa operacja dodawania, zastępowania lub usuwania fragmentów
  • Jetpack Fragment — biblioteka do wstecznej kompatybilności aż do Android 1.6 (API 4)
  • ViewModel — wspólny komponent do wymiany danych między fragmentami w jednym Activity

Czym jest Fragment?

Fragment — modułowy komponent interfejsu użytkownika Androida, który reprezentuje część ekranu wewnątrz Activity. Fragment może zarządzać własnym layoutem, obsługiwać zdarzenia cyklu życia i zapisywać swój stan. Dzięki modułowości jeden fragment może być używany w różnych Activity i na różnych urządzeniach.

Fragment API pojawił się w Android 3.0 (Honeycomb, API 11) w 2011 roku dla obsługi tabletów. Do tego czasu programiści musieli tworzyć osobne Activity dla telefonu i tabletu. Fragment umożliwił składanie ekranu z niezależnych bloków. W 2019 roku Google wydało Jetpack Fragment library z wsteczną kompatybilnością aż do API 4.

Według danych Google (2026), 80% aplikacji w Google Play używa Fragment w takiej czy innej formie. Jetpack Fragment library została pobrana ponad 10 miliardów razy przez Google Play Services. Fragment pozostaje kluczowym komponentem architektury Androida nawet w erze Jetpack Compose.

Cykl życia Fragment

Cykl życia Fragment jest bardziej złożony niż w przypadku Activity, ponieważ zależy od stanu Activity-gospodarza. Fragment przechodzi przez te same stany co Activity, ale dodaje własne callbacki: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Callback FragmentOdpowiednik ActivityPrzeznaczenie
onAttachprzed onCreateFragment dołączony do Activity
onCreateonCreateInicjalizacja danych niezwiązanych z UI
onCreateViewonCreateTworzenie layoutu przez inflater
onViewCreatedonCreatePowiązanie elementów UI po utworzeniu widoku
onDestroyViewonDestroyUsunięcie widoku, zwolnienie zasobów UI
onDetachonDestroyFragment odłączony od Activity

Porównanie Lifecycle Fragment i Activity

Główna różnica cyklu życia Fragment — wywołanie onCreateView i onDestroyView między onCreate a onDestroy. Fragment może istnieć bez UI (jeśli onCreateView zwraca null). Po odtworzeniu Activity FragmentManager przywraca fragmenty automatycznie.

FragmentManager i transakcje

FragmentManager — centralna klasa do zarządzania fragmentami w Activity. Odpowiada za dodawanie, usuwanie, zastępowanie fragmentów, zarządzanie back stack i przywracanie stanu. FragmentManager jest dostępny przez supportFragmentManager (AndroidX) lub fragmentManager (stare API).

kotlin
class MainActivity : AppCompatActivity() {

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

        // Jeśli fragment nie został jeszcze dodany — tworzymy
        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()
    }
}

Transakcje FragmentTransaction — są atomowe. commit() planuje wykonanie na następny cykl Looper. Do natychmiastowego wykonania użyj commitNow(). addToBackStack(null) dodaje transakcję do stosu wstecz — przycisk «Wstecz» cofnie operację.

Metody cyklu życia Fragment

Omówmy kluczowe metody cyklu życia Fragment na przykładzie w Kotlin. onCreateView tworzy layout — w przeciwieństwie do Activity metoda musi zwrócić View. onViewCreated jest wywoływany zaraz potem, tutaj można bezpiecznie znajdować elementy po id. onDestroyView — ostatni moment na czyszczenie referencji do widoku.

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("Szczegóły")
    }

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

Wzorzec View Binding z _binding/binding gwarantuje, że po onDestroyView referencja do layoutu jest zerowana. Odwołanie do binding po zniszczeniu widoku spowoduje NullPointerException. Ten wzorzec jest zalecany przez Google dla wszystkich fragmentów.

Przekazywanie danych między fragmentami

Do przekazywania danych między fragmentami Android oferuje kilka mechanizmów. Najbardziej niezawodny — wspólny ViewModel, współdzielony między fragmentami jednego Activity. Fragment Result API nadaje się do jednorazowych zdarzeń. Argumenty Bundle — do danych przy tworzeniu fragmentu.

kotlin
// Wspólny ViewModel dla dwóch fragmentów
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

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

// Fragment A: wysyła zdarzenie przez Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))

// Fragment B: odbiera zdarzenie
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Fragment Result API (dodany w Fragment 1.3.0) zastępuje przestarzałe setTargetFragment/onActivityResult. API jest bezpieczne typowo, używa Bundle i nie wymaga znajomości odbiorcy. Parent FragmentManager pełni rolę pośrednika między fragmentami.

Fragment vs Activity: kiedy co wybrać

Wybór między Fragment a Activity zależy od architektury aplikacji. Fragment jest obowiązkowy dla adaptacyjnych układów (telefon + tablet), dla niestandardowych animacji przejść i do korzystania z Jetpack Navigation. Activity jest preferowane dla prostych aplikacji z jednym-dwoma ekranami.

KryteriumFragmentActivity
Szybkość tworzeniaSzybszy (lekki komponent)Wolniejszy (proces systemowy)
Ponowne wykorzystanieWysokie (jeden fragment w różnych Activity)Niskie (każdy ekran — własne Activity)
Animacja przejśćElastyczna (FragmentTransaction)Ograniczona (overridePendingTransition)
Zapisywanie przy obrocieAutomatyczne (manager przywraca)Ręczne (onSaveInstanceState)
Deep LinksPrzez Navigation ComponentNatywne wsparcie przez intent-filter

Jetpack Fragment i Jetpack Navigation

Nowoczesne podejście do pracy z Fragment — Jetpack Navigation Component, który zastępuje ręczne zarządzanie FragmentManager. Biblioteka udostępnia NavGraph (XML-graf nawigacji), NavHostFragment i Safe Args do bezpiecznego typowo przesyłania danych.

Jetpack Fragment library (androidx.fragment:fragment-ktx) zawiera FragmentResult API, DialogFragment, BottomSheetDialogFragment i integrację z Lifecycle-aware komponentami. Od 2026 roku Google zaleca używanie Fragment tylko przez Jetpack Navigation, a nie bezpośrednio.

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="Lista">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Szczegóły" />
</navigation>

Często zadawane pytania

FragmentManager — co to jest?

FragmentManager — klasa zarządzająca transakcjami fragmentów. Dodaje, usuwa, zastępuje fragmenty w kontenerze Activity. FragmentManager przywraca stan fragmentów przy odtwarzaniu Activity i zarządza back stack.

Czym Fragment różni się od Activity?

Fragment — część UI wewnątrz Activity, nie może istnieć samodzielnie. Fragment przetrwa odtworzenie Activity przy obrocie ekranu. Activity — pełnoprawny ekran z własnym Lifecycle, Fragment zależy od Lifecycle Activity.

Kiedy używać Fragment zamiast Activity?

Fragment — gdy ekran składa się z kilku niezależnych bloków (zakładki, master-detail, adaptacja pod tablet). Activity — gdy ekran nie ma powtarzalnych bloków. Google zaleca Single Activity + wiele Fragment.

Jak przekazać dane między Fragmentami?

Trzy sposoby: przez nadrzędne Activity (wspólny ViewModel), przez Fragment Result API (setFragmentResult), przez argumenty Bundle przy tworzeniu Fragment. ViewModel — preferowany sposób, ponieważ dane są zachowywane przy odtwarzaniu.

Co to jest Fragment Transaction?

Fragment Transaction — atomowa operacja zmiany zbioru fragmentów. FragmentManager.beginTransaction() otwiera transakcję, w której można wywołać add, remove, replace, hide, show. Każda transakcja kończy się commit() lub commitNow().

Podsumowanie

  • Fragment — wielokrotnego użytku komponent UI wewnątrz Activity z własnym cyklem życia, layoutem i stanem
  • FragmentManager zarządza transakcjami fragmentów i przywraca ich stan przy odtwarzaniu Activity
  • FragmentTransaction — atomowa operacja dodawania, zastępowania, usuwania i ukrywania fragmentów
  • Cykl życia Fragment obejmuje sześć callbacków, od onAttach do onDetach, z dodatkowym punktem onCreateView
  • ViewModel — zalecany sposób wymiany danych między fragmentami w jednym Activity
  • Fragment Result API zapewnia bezpieczne typowo przesyłanie jednorazowych zdarzeń między fragmentami

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również