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 — 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 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 Fragment | Odpowiednik Activity | Przeznaczenie |
|---|---|---|
| onAttach | przed onCreate | Fragment dołączony do Activity |
| onCreate | onCreate | Inicjalizacja danych niezwiązanych z UI |
| onCreateView | onCreate | Tworzenie layoutu przez inflater |
| onViewCreated | onCreate | Powiązanie elementów UI po utworzeniu widoku |
| onDestroyView | onDestroy | Usunięcie widoku, zwolnienie zasobów UI |
| onDetach | onDestroy | Fragment odłączony od 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 — 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).
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ę.
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.
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.
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.
// 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.
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.
| Kryterium | Fragment | Activity |
|---|---|---|
| Szybkość tworzenia | Szybszy (lekki komponent) | Wolniejszy (proces systemowy) |
| Ponowne wykorzystanie | Wysokie (jeden fragment w różnych Activity) | Niskie (każdy ekran — własne Activity) |
| Animacja przejść | Elastyczna (FragmentTransaction) | Ograniczona (overridePendingTransition) |
| Zapisywanie przy obrocie | Automatyczne (manager przywraca) | Ręczne (onSaveInstanceState) |
| Deep Links | Przez Navigation Component | Natywne wsparcie przez intent-filter |
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.
<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 — 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.
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.
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.
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.
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
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.
Przeczytaj również