Fragment Lifecycle: Grundlagen, onCreateView- und onViewCreated-Methoden

Autor: IT Sectr Veröffentlicht: 2026-03-04 Lesezeit: 12 Min.

Fragment Lifecycle ist eine streng definierte Sequenz von Callback-Methoden, die Android während der Lebensdauer eines Fragment aufruft: von der Erstellung (onAttach) bis zur vollständigen Entfernung (onDetach). Fragment hat einen komplexeren Lebenszyklus als Activity — er umfasst 11 Zustände und 7 Haupt-Callbacks. Der Fragment Lifecycle wird über FragmentManager verwaltet und ist eng mit dem Lebenszyklus der enthaltenen Activity verbunden. Laut Google wird Fragment in 74% der Android-Anwendungen verwendet, die auf API Level 21+ laufen, was das Verständnis des Fragment Lifecycle für die professionelle Android-Entwicklung unerlässlich macht. Die Android-Dokumentation zum Fragment Lifecycle beschreibt alle Zustände und Aufrufgarantien.

Wichtige Punkte

  • Fragment Lifecycle umfasst 11 Callbacks: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach.
  • FragmentManager verwaltet die Fragment-Zustände und gewährleistet die korrekte Reihenfolge der Aufrufe bei Transaktionen.
  • onCreateView und onViewCreated sind Schlüsselmethoden zum Erstellen und Konfigurieren der Fragment-UI.
  • Fragment kann seine Activity überleben (bei Bildschirmdrehung) und den Zustand über onSaveInstanceState wiederherstellen.
  • viewLifecycleOwner — ein separater Lifecycle für die Fragment-View, der in onDestroyView zerstört wird.

Fragment Lifecycle: Grundlagen des Lebenszyklus

Fragment Lifecycle ist eine Reihe miteinander verbundener Zustände und Methoden, die jede Fragment-Instanz von der Erstellung bis zur Zerstörung durchläuft. Im Gegensatz zur Activity ist der Lebenszyklus von Fragment an zwei Kontexte gebunden: das Fragment selbst (lebt von onAttach bis onDetach) und seine View (lebt von onCreateView bis onDestroyView). Diese Trennung ist ein Hauptmerkmal von Fragment, das es ihm ermöglicht, die Zerstörung der View bei Bildschirmdrehung zu überleben, ohne das Fragment selbst zu zerstören.

Vollständige Sequenz der Fragment-Callbacks:

  • onAttach(Context) — Fragment wird an die Activity gebunden. Wird als erstes aufgerufen. Context ist die Host-Activity.
  • onCreate(Bundle) — Fragment wird initialisiert. Hier werden ViewModel erstellt und Adapter konfiguriert.
  • onCreateView(LayoutInflater, ViewGroup, Bundle) — Die Fragment-View-Hierarchie wird erstellt. Gibt die root-View zurück.
  • onViewCreated(View, Bundle) — View wurde erstellt. Hier werden UI-Elemente konfiguriert und LiveData-Abonnements eingerichtet.
  • onStart() — Fragment wird sichtbar. Animationen starten, Sensoren werden registriert.
  • onResume() — Fragment ist aktiv und interagiert mit dem Benutzer.
  • onPause() — Fragment verliert den Fokus. Animationen werden gestoppt.
  • onStop() — Fragment ist nicht sichtbar. Nicht kritische Ressourcen werden freigegeben.
  • onDestroyView() — Die View-Hierarchie wird zerstört. View-Referenzen werden auf null gesetzt.
  • onDestroy() — Fragment wird zerstört. Koroutinen, die nicht in viewModelScope sind, werden abgebrochen.
  • onDetach() — Fragment wird von der Activity gelöst. Endgültige Bereinigung.

Laut Google durchläuft der durchschnittliche Fragment in einer modernen Anwendung 3–5 Mal pro Benutzersitzung den vollständigen Zyklus (aufgrund von Bildschirmdrehungen und Navigation). Die korrekte Handhabung aller Phasen ist die Grundlage der UI-Stabilität.

Fragment-Zustände: von INITIALIZED bis DESTROYED

FragmentManager verwaltet Fragment über fünf Hauptzustände, die in der Klasse Fragment.State definiert sind. Jeder Zustand entspricht einer bestimmten Menge von Callbacks, die ausgeführt wurden.

ZustandBedeutungAusgeführte Callbacks
INITIALIZEDFragment wurde erstellt, aber View ist noch nicht verfügbaronAttach, onCreate
CREATEDView wurde erstellt, aber Fragment ist nicht sichtbar+ onCreateView, onViewCreated
STARTEDFragment ist sichtbar, aber nicht aktiv+ onStart
RESUMEDFragment ist aktiv und interagiert mit dem Benutzer+ onResume
DESTROYEDFragment wurde zerstört+ onDestroyView, onDestroy, onDetach

FragmentManager bewegt Fragment zwischen Zuständen basierend auf Benutzeraktionen und Systemereignissen. Beim Hinzufügen eines Fragment zu einem Container durchläuft es nacheinander INITIALIZED → CREATED → STARTED → RESUMED. Beim Entfernen — RESUMED → STARTED → CREATED → DESTROYED.

Der CREATED-Zustand ist besonders: Die View kann zerstört werden (nach onDestroyView), aber das Fragment selbst bleibt im Zustand CREATED (nach onDestroyView, vor onDestroy). Dies ermöglicht FragmentManager, das Fragment ohne View im Speicher zu behalten, was zum Überleben von Bildschirmdrehungen notwendig ist.

Unterschied zwischen Fragment Lifecycle und Activity Lifecycle

Fragment Lifecycle und Activity Lifecycle sind eng verwandt, haben aber grundlegende Unterschiede. Fragment lebt immer innerhalb einer Activity, und sein Lebenszyklus hängt von der Host-Activity ab, ist aber nicht identisch mit ihr.

AspektActivityFragment
Anzahl der Callbacks7 (onCreate … onDestroy)11 (onAttach … onDetach)
Separater Lifecycle für ViewNeinJa (viewLifecycleOwner)
Überlebt DrehungNein (wird zerstört)Ja (ViewModel + Fragment überleben)
Abhängigkeit vom HostNeinAbhängig vom Activity Lifecycle
ZustandsspeicherungonSaveInstanceStateonSaveInstanceState (Fragment-Ebene)
VerwaltungSystemFragmentManager

Der wichtigste praktische Unterschied: Bei Bildschirmdrehung wird die Activity vollständig zerstört (onDestroy) und neu erstellt (onCreate). Fragment durchläuft bei der Drehung onDestroyView (View wird zerstört) → onCreateView (View wird neu erstellt), aber das Fragment selbst und sein ViewModel bleiben lebendig. Dies macht Fragment zu einem idealen Container für UI-Logik, die Konfigurationsänderungen überleben muss.

Aufrufreihenfolge bei Bildschirmdrehung: Activity.onPause → Fragment.onPause → Activity.onStop → Fragment.onStop → Activity.onDestroy → Fragment.onDestroyView → (Activity zerstört) → Activity.onCreate → Fragment.onAttach → Fragment.onCreate → Fragment.onCreateView → Fragment.onViewCreated → Activity.onStart → Fragment.onStart → Activity.onResume → Fragment.onResume.

FragmentManager: Zustandsverwaltung und Transaktionen

FragmentManager ist die zentrale Klasse, die für das Hinzufügen, Entfernen und Ersetzen von Fragmenten sowie die Verwaltung ihrer Zustände verantwortlich ist. FragmentManager verwaltet den BackStack und gewährleistet die korrekte Callback-Reihenfolge bei Transaktionen. Jede Activity und jedes verschachtelte Fragment hat seinen eigenen FragmentManager.

Hauptoperationen von FragmentManager:

  • beginTransaction() — öffnet eine Transaktion für eine Gruppe von Operationen.
  • add() — fügt ein Fragment zu einem Container hinzu. Fragment durchläuft den vollständigen Lebenszyklus bis RESUMED.
  • replace() — ersetzt das aktuelle Fragment durch ein neues. Entspricht remove() + add().
  • remove() — entfernt ein Fragment. Fragment durchläuft den Lebenszyklus von RESUMED bis DESTROYED.
  • hide()/show() — versteckt/zeigt Fragment ohne Zerstörung der View. Fragment wechselt bei hide zu STARTED, bei show zurück zu RESUMED.
  • detach()/attach() — löst/verbindet Fragment. detach zerstört die View (onDestroyView), attach erstellt sie neu (onCreateView).
  • addToBackStack() — fügt die Transaktion zum BackStack für die Rückwärtsnavigation hinzu.

BackStack ist der Transaktionsstapel von FragmentManager. Beim Drücken der System-Zurück-Taste wird die letzte Transaktion im BackStack rückgängig gemacht (popBackStack()). Ein über popBackStack entferntes Fragment wird wiederhergestellt. Wenn der BackStack leer ist, beendet das Drücken von Zurück die Activity.

Laut Google stehen 78% der Fragment-Probleme (Duplizierung, leere Bildschirme, IllegalStateException) im Zusammenhang mit falscher Verwendung von FragmentManager. Die Hauptregel: Führen Sie Transaktionen je nach Kontext über commit() (asynchron) oder commitNow() (synchron) aus. commit() gewährleistet die korrekte Reihenfolge bei mehreren Transaktionen.

Speichern des Fragment-Zustands: onSaveInstanceState

Fragment unterstützt einen eigenen Mechanismus zur Zustandsspeicherung über onSaveInstanceState, der unabhängig von der Activity funktioniert. Fragment speichert den Zustand in einem Bundle, das bei der Wiederherstellung an onCreate und onCreateView übergeben wird.

Wann Fragment den Zustand speichert:

  • Bei Bildschirmdrehung — View wird zerstört, Fragment speichert den Zustand im Bundle.
  • Beim erneuten Verbinden von Fragment mit Activity nach Prozessende.
  • Wenn onSaveInstanceState von Activity aufgerufen wird (das System propagiert das Speichern an alle untergeordneten Fragmente).

Moderner Ansatz: Verwenden Sie SavedStateHandle im ViewModel zum Speichern des Fragment-Zustands. SavedStateHandle speichert und stellt Daten automatisch bei Bildschirmdrehung und Prozessende wieder her, ohne manuelles onSaveInstanceState. Google empfiehlt SavedStateHandle als bevorzugte Methode zum Speichern des UI-Zustands in Fragment.

setRetainInstance (veraltet seit Fragment 1.3): Früher konnte Fragment über setRetainInstance(true) bei Bildschirmdrehung beibehalten werden. Dieser Ansatz wurde durch ViewModel + SavedStateHandle ersetzt, die zuverlässiger funktionieren und keine spezielle Konfiguration erfordern.

viewLifecycleOwner: separater Lebenszyklus der View

viewLifecycleOwner ist ein Lifecycle, der an die Fragment-View gebunden ist (von onCreateView bis onDestroyView). Dies ist ein grundlegend wichtiges Konzept: Über viewLifecycleOwner getätigte LiveData/Flow-Abonnements werden automatisch gekündigt, wenn die View zerstört wird (onDestroyView), beeinflussen aber nicht das Fragment selbst.

Unterschied zwischen viewLifecycleOwner und Fragment-Lifecycle:

  • lifecycle (Fragment) — lebt von onAttach bis onDetach. Abonnements bleiben auch nach Zerstörung der View aktiv.
  • viewLifecycleOwner — lebt von onCreateView bis onDestroyView. Abonnements werden bei Zerstörung der View gekündigt.

Warum das wichtig ist: Wenn Sie LiveData über den Fragment-Lifecycle (this) abonnieren, bleibt das Abonnement nach onDestroyView aktiv und LiveData versucht, eine null-View zu aktualisieren, was eine NPE verursacht. Das Abonnieren über viewLifecycleOwner garantiert, dass nach onDestroyView keine UI-Aktualisierungen erfolgen.

Regel: Verwenden Sie im Fragment immer viewLifecycleOwner für Abonnements von LiveData, Flow und UI-bezogenen Koroutinen. Für ViewModel-Koroutinen verwenden Sie viewModelScope — es ist an ViewModel gebunden, nicht an Fragment.

Fragment-Codebeispiele in Kotlin

Beispiel 1: Basis-Fragment mit onViewCreated und viewLifecycleOwner

Zeigt korrekte UI-Initialisierung und LiveData-Abonnement über viewLifecycleOwner.

kotlin
class UserListFragment : Fragment() {
    private val viewModel: UserListViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.fragment_user_list, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val button: Button = view.findViewById(R.id.load_button)
        button.setOnClickListener { viewModel.loadUsers() }
        viewModel.users.observe(viewLifecycleOwner) { users ->
            Log.d("UserListFragment", "Liste wird aktualisiert: ${users.size} Benutzer")
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        Log.d("UserListFragment", "onDestroyView: View zerstört")
    }
}

Fragment inflatet das Layout in onCreateView, konfiguriert die UI und abonniert LiveData in onViewCreated. Das Abonnement über viewLifecycleOwner ist eine zwingende Anforderung zur Vermeidung von Speicherlecks. onDestroyView protokolliert die Zerstörung der View — Bestätigung, dass Fragment die Bildschirmdrehung überlebt.

Beispiel 2: Fragment mit FragmentManager und Transaktionen

Zeigt das Hinzufügen von Fragment über FragmentManager in Activity, Ersetzung mit BackStack und Wiederherstellung.

kotlin
class HostActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_host)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(R.id.fragment_container, HomeFragment())
                .addToBackStack(null)
                .commit()
        }
    }

    fun openDetail(userId: String) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, DetailFragment.newInstance(userId))
            .addToBackStack(null)
            .commit()
    }

    override fun onBackPressed() {
        if (supportFragmentManager.backStackEntryCount > 0) {
            supportFragmentManager.popBackStack()
        } else {
            super.onBackPressed()
        }
    }
}

class DetailFragment : Fragment() {
    companion object {
        fun newInstance(userId: String): DetailFragment {
            return DetailFragment().apply {
                arguments = Bundle().apply { putString("user_id", userId) }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val userId = arguments?.getString("user_id")
        Log.d("DetailFragment", "Lade Benutzerdetails: $userId")
    }
}

Activity verwendet supportFragmentManager zur Verwaltung von Fragmenten. Die add()-Transaktion mit BackStack stellt sicher, dass HomeFragment beim Drücken von Zurück wiederhergestellt wird. openDetail() ersetzt das aktuelle Fragment durch DetailFragment mit Argumenten. Die Prüfung auf savedInstanceState == null verhindert Fragment-Duplizierung bei Bildschirmdrehung.

Beispiel 3: Fragment mit LifecycleObserver und StateFlow

Verwendung von Flow und StateFlow in Fragment mit viewLifecycleOwner für reaktive UI-Updates.

kotlin
class SearchFragment : Fragment() {
    private val viewModel: SearchViewModel by viewModels()
    private var binding: FragmentSearchBinding? = null

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

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding?.searchButton?.setOnClickListener {
            viewModel.search(binding?.queryInput?.text.toString())
        }
        viewLifecycleOwner.lifecycleScope.launch {
            viewModel.searchResults.collectLatest { results ->
                Log.d("SearchFragment", "Suchergebnisse: ${results.size}")
            }
        }
    }

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

Fragment verwendet View Binding für den View-Zugriff. Die Koroutine viewLifecycleOwner.lifecycleScope.launch wird automatisch abgebrochen, wenn die View zerstört wird. Binding wird in onDestroyView auf null gesetzt, um Speicherlecks zu vermeiden. StateFlow stellt die Aktualität der Daten bei Neuerstellung der View sicher.

Häufig gestellte Fragen

Wie unterscheidet sich onViewCreated von onCreateView?

onCreateView erstellt und gibt die root-View des Fragment zurück. onViewCreated wird unmittelbar nach der Erstellung der View aufgerufen und garantiert, dass die View vollständig initialisiert und für die Konfiguration (findViewById, Abonnements) bereit ist. Google empfiehlt, in onCreateView nur das Layout zu inflaten und die gesamte UI-Konfiguration in onViewCreated durchzuführen.

Wann wird Fragment tatsächlich zerstört — bei onDestroy oder onDetach?

onDestroy — Fragment wird als Objekt zerstört (ViewModel wird bereinigt, Koroutinen werden abgebrochen). onDetach ist der letzte Callback, nach dem Fragment von der Activity getrennt wird. Praktisch alle Ressourcen sollten in onDestroyView (View) und onDestroy (Fragment) freigegeben werden. onDetach dient zum Bereinigen von Referenzen auf die Activity.

Warum verschwindet Fragment nach Bildschirmdrehung?

Fragment verschwindet, wenn es nicht über eine Transaktion mit BackStack-Erhaltung zu FragmentManager hinzugefügt wurde oder wenn Activity FragmentManager in onCreate nicht wiederherstellt. Lösung: Fügen Sie Fragment programmatisch über supportFragmentManager.beginTransaction().add() in onCreate mit einer savedInstanceState == null-Prüfung hinzu.

Kann ein Fragment ohne Activity existieren?

Nein. Fragment ist immer über FragmentManager an eine Activity gebunden. Selbst bei Bildschirmdrehung wird Activity neu erstellt und Fragment wird an die neue Activity wieder angebunden. Ein Fragment außerhalb einer Activity zu erstellen ist unmöglich — der Fragment-Konstruktor erfordert einen leeren Konstruktor für die Systemwiederherstellung.

Was sind verschachtelte Fragmente und wofür werden sie benötigt?

Verschachtelte Fragmente (nested fragments) sind Fragmente innerhalb eines anderen Fragments. Sie werden zum Erstellen komplexer Bildschirme verwendet: Tab-Panels, Panel mit Registerkarten, Master-Detail. Verschachtelte Fragmente werden vom untergeordneten FragmentManager (childFragmentManager) verwaltet. Google empfiehlt, nicht mehr als 2 Verschachtelungsebenen zu überschreiten, um Leistungsprobleme zu vermeiden.

Zusammenfassung

  • Fragment Lifecycle umfasst 11 Callbacks: onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → onPause → onStop → onDestroyView → onDestroy → onDetach.
  • FragmentManager verwaltet die Fragment-Zustände (INITIALIZED → CREATED → STARTED → RESUMED → DESTROYED) und den Transaktions-BackStack.
  • Fragment überlebt Bildschirmdrehung — View wird zerstört (onDestroyView), aber Fragment und ViewModel bleiben lebendig.
  • viewLifecycleOwner ist ein separater Lifecycle für die Fragment-View; obligatorisch für LiveData- und UI-Koroutinen-Abonnements.
  • Speichern des Fragment-Zustands — über onSaveInstanceState oder SavedStateHandle im ViewModel.
  • Fragment-Transaktionen werden über FragmentManager mit commit() (asynchron) oder commitNow() (synchron) ausgeführt.
  • Setzen Sie in onDestroyView immer Binding und View-Referenzen auf null, um Speicherlecks zu vermeiden.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch