Fragment Lifecycle: dasar, metode onCreateView onViewCreated

Penulis: IT Sectr Diterbitkan: 2026-03-04 Waktu membaca: 12 mnt

Fragment Lifecycle — urutan yang ditentukan secara ketat dari metode callback yang dipanggil Android selama hidup Fragment: dari pembuatan (onAttach) hingga penghapusan lengkap (onDetach). Fragment memiliki siklus hidup yang lebih kompleks daripada Activity — mencakup 11 status dan 7 callback utama. Fragment Lifecycle dikelola melalui FragmentManager dan terkait erat dengan siklus hidup Activity yang menampungnya. Menurut data Google, Fragment digunakan dalam 74% aplikasi Android yang berjalan di API Level 21+, membuat pemahaman Fragment Lifecycle menjadi wajib untuk pengembangan Android profesional. Dokumentasi Android tentang Fragment Lifecycle menjelaskan semua status dan jaminan panggilan.

Poin utama

  • Fragment Lifecycle mencakup 7 callback: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach.
  • FragmentManager mengelola status Fragment dan menjamin urutan panggilan yang benar dalam transaksi.
  • onCreateView dan onViewCreated — metode kunci untuk membuat dan mengkonfigurasi UI Fragment.
  • Fragment dapat bertahan dari Activity-nya (saat rotasi layar) dan memulihkan status melalui onSaveInstanceState.
  • viewLifecycleOwner — Lifecycle terpisah untuk View Fragment, dihancurkan di onDestroyView.

Fragment Lifecycle: dasar siklus hidup

Fragment Lifecycle adalah kumpulan status dan metode yang saling terkait yang dilalui setiap instance Fragment dari saat pembuatan hingga penghancuran. Berbeda dengan Activity, siklus hidup Fragment terikat pada dua konteks: Fragment itu sendiri (hidup dari onAttach hingga onDetach) dan View-nya (hidup dari onCreateView hingga onDestroyView). Pemisahan ini adalah fitur utama Fragment, memungkinkannya bertahan dari penghancuran View saat rotasi layar tanpa menghancurkan Fragment itu sendiri.

Urutan lengkap callback Fragment:

  • onAttach(Context) — Fragment terikat ke Activity. Dipanggil pertama. Context — Activity-host.
  • onCreate(Bundle) — Fragment diinisialisasi. Di sini ViewModel dibuat, adapter dikonfigurasi.
  • onCreateView(LayoutInflater, ViewGroup, Bundle) — hierarki View Fragment dibuat. Mengembalikan View root.
  • onViewCreated(View, Bundle) — View telah dibuat. Di sini elemen UI dikonfigurasi, langganan LiveData diatur.
  • onStart() — Fragment terlihat. Animasi dimulai, sensor didaftarkan.
  • onResume() — Fragment aktif, berinteraksi dengan pengguna.
  • onPause() — Fragment kehilangan fokus. Animasi dihentikan.
  • onStop() — Fragment tidak terlihat. Sumber daya tidak kritis dibebaskan.
  • onDestroyView() — hierarki View dihancurkan. Referensi ke View dinolkan.
  • onDestroy() — Fragment dihancurkan. Korutin yang tidak dalam viewModelScope dibatalkan.
  • onDetach() — Fragment terlepas dari Activity. Pembersihan akhir.

Menurut Google, rata-rata fragmen dalam aplikasi modern melewati siklus penuh 3–5 kali per sesi pengguna (karena rotasi layar dan navigasi). Penanganan yang benar dari semua fase adalah dasar stabilitas UI.

Status Fragment: dari INITIALIZED hingga DESTROYED

FragmentManager mengelola Fragment melalui lima status utama, didefinisikan dalam kelas Fragment.State. Setiap status sesuai dengan kumpulan callback tertentu yang telah dijalankan.

StatusArtiCallback yang dijalankan
INITIALIZEDFragment dibuat, tetapi View belum adaonAttach, onCreate
CREATEDView dibuat, tetapi Fragment tidak terlihat+ onCreateView, onViewCreated
STARTEDFragment terlihat, tetapi tidak aktif+ onStart
RESUMEDFragment aktif, berinteraksi dengan pengguna+ onResume
DESTROYEDFragment dihancurkan+ onDestroyView, onDestroy, onDetach

FragmentManager memindahkan Fragment antar status tergantung pada tindakan pengguna dan peristiwa sistem. Saat menambahkan Fragment ke kontainer, ia secara berurutan melewati INITIALIZED → CREATED → STARTED → RESUMED. Saat dihapus — RESUMED → STARTED → CREATED → DESTROYED.

Status CREATED — khusus: View dapat dihancurkan (setelah onDestroyView), tetapi Fragment itu sendiri tetap dalam status CREATED (setelah onDestroyView, sebelum onDestroy). Ini memungkinkan FragmentManager menyimpan Fragment di memori tanpa View, yang diperlukan untuk bertahan dari rotasi layar.

Perbedaan Fragment Lifecycle dan Activity Lifecycle

Fragment Lifecycle dan Activity Lifecycle terkait erat, tetapi memiliki perbedaan mendasar. Fragment selalu hidup di dalam Activity, dan siklus hidupnya bergantung pada Activity inang, tetapi tidak identik dengannya.

AspekActivityFragment
Jumlah callback7 (onCreate … onDestroy)11 (onAttach … onDetach)
Lifecycle terpisah untuk ViewTidakYa (viewLifecycleOwner)
Bertahan dari rotasiTidak (dihancurkan)Ya (ViewModel + Fragment bertahan)
Ketergantungan pada inangTidakTergantung pada Activity Lifecycle
Penyimpanan statusonSaveInstanceStateonSaveInstanceState (fragmen)
ManajemenSistemFragmentManager

Perbedaan praktis utama: saat rotasi layar, Activity dihancurkan sepenuhnya (onDestroy) dan dibuat ulang (onCreate). Fragment saat rotasi melewati onDestroyView (View dihancurkan) → onCreateView (View dibuat ulang), tetapi Fragment itu sendiri dan ViewModel-nya tetap hidup. Ini menjadikan Fragment wadah ideal untuk logika UI yang harus bertahan dari perubahan konfigurasi.

Urutan panggilan saat rotasi layar: Activity.onPause → Fragment.onPause → Activity.onStop → Fragment.onStop → Activity.onDestroy → Fragment.onDestroyView → (Activity dihancurkan) → Activity.onCreate → Fragment.onAttach → Fragment.onCreate → Fragment.onCreateView → Fragment.onViewCreated → Activity.onStart → Fragment.onStart → Activity.onResume → Fragment.onResume.

FragmentManager: manajemen status dan transaksi

FragmentManager — kelas pusat yang bertanggung jawab untuk menambah, menghapus, mengganti fragmen dan mengelola status mereka. FragmentManager memelihara tumpukan BackStack dan menjamin urutan callback yang benar dalam transaksi. Setiap Activity dan setiap fragmen bersarang memiliki FragmentManager sendiri.

Operasi utama FragmentManager:

  • beginTransaction() — membuka transaksi untuk grup operasi.
  • add() — menambahkan Fragment ke kontainer. Fragment melewati lifecycle lengkap hingga RESUMED.
  • replace() — mengganti Fragment saat ini dengan yang baru. sama dengan remove() + add().
  • remove() — menghapus Fragment. Fragment melewati lifecycle dari RESUMED hingga DESTROYED.
  • hide()/show() — menyembunyikan/menampilkan Fragment tanpa menghancurkan View. Fragment beralih ke STARTED saat hide, kembali ke RESUMED saat show.
  • detach()/attach() — melepas/melampirkan Fragment. detach menghancurkan View (onDestroyView), attach membuat ulang (onCreateView).
  • addToBackStack() — menambahkan transaksi ke BackStack untuk kemungkinan navigasi “Kembali”.

BackStack — tumpukan transaksi FragmentManager. Saat tombol sistem “Kembali” ditekan, transaksi terakhir di BackStack dibatalkan (popBackStack()). Fragment yang dihapus melalui popBackStack dipulihkan. Jika BackStack kosong, menekan “Kembali” mengakhiri Activity.

Menurut Google, 78% masalah dengan Fragment (duplikasi, layar kosong, IllegalStateException) terkait dengan penggunaan FragmentManager yang tidak benar. Aturan utama: lakukan transaksi melalui commit() (asinkron) atau commitNow() (sinkron) tergantung konteks. commit() menjamin urutan yang benar dalam transaksi berganda.

Menyimpan status Fragment: onSaveInstanceState

Fragment mendukung mekanisme penyimpanan status sendiri melalui onSaveInstanceState, yang bekerja independen dari Activity. Fragment menyimpan status dalam Bundle, yang diteruskan ke onCreate dan onCreateView saat pemulihan.

Kapan Fragment menyimpan status:

  • Saat rotasi layar — View dihancurkan, Fragment menyimpan status dalam Bundle.
  • Saat melampirkan Fragment ke Activity setelah process death.
  • Saat pemanggilan onSaveInstanceState dari Activity (sistem menyebarkan penyimpanan ke semua fragmen anak).

Pendekatan modern: gunakan SavedStateHandle di ViewModel untuk menyimpan status Fragment. SavedStateHandle secara otomatis menyimpan dan memulihkan data saat rotasi layar dan process death, tanpa memerlukan onSaveInstanceState manual. Google merekomendasikan SavedStateHandle sebagai cara pilihan untuk menyimpan status UI di Fragment.

setRetainInstance (usang sejak Fragment 1.3): sebelumnya Fragment dapat dipertahankan melalui setRetainInstance(true) saat rotasi layar. Pendekatan ini telah digantikan oleh ViewModel + SavedStateHandle, yang bekerja lebih andal dan tidak memerlukan konfigurasi khusus.

viewLifecycleOwner: siklus hidup terpisah untuk View

viewLifecycleOwner — Lifecycle yang terikat pada View Fragment (dari onCreateView hingga onDestroyView). Ini adalah konsep yang sangat penting: langganan LiveData/Flow yang dibuat melalui viewLifecycleOwner secara otomatis dibatalkan saat penghancuran View (onDestroyView), tetapi tidak mempengaruhi Fragment itu sendiri.

Perbedaan antara viewLifecycleOwner dan lifecycle Fragment:

  • lifecycle (Fragment) — hidup dari onAttach hingga onDetach. Langganan tetap aktif bahkan setelah penghancuran View.
  • viewLifecycleOwner — hidup dari onCreateView hingga onDestroyView. Langganan dibatalkan saat penghancuran View.

Mengapa ini penting: jika Anda berlangganan LiveData melalui lifecycle Fragment (this), setelah onDestroyView langganan tetap aktif dan LiveData akan mencoba memperbarui View null, menyebabkan NPE. Langganan melalui viewLifecycleOwner menjamin bahwa setelah onDestroyView tidak akan ada pembaruan UI.

Aturan: di Fragment, selalu gunakan viewLifecycleOwner untuk langganan LiveData, Flow, dan korutin yang terkait dengan UI. Untuk korutin ViewModel, gunakan viewModelScope — ini terikat pada ViewModel, bukan Fragment.

Contoh kode Fragment di Kotlin

Contoh 1: Fragment dasar dengan onViewCreated dan viewLifecycleOwner

Menunjukkan inisialisasi UI yang benar dan langganan LiveData melalui 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", "Memperbarui daftar: ${users.size} pengguna")
        }
    }

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

Fragment mengembang layout di onCreateView, mengkonfigurasi UI dan berlangganan LiveData di onViewCreated. Langganan melalui viewLifecycleOwner — persyaratan wajib untuk mencegah kebocoran memori. onDestroyView mencatat penghancuran View — konfirmasi bahwa Fragment bertahan dari rotasi layar.

Contoh 2: Fragment dengan FragmentManager dan transaksi

Menunjukkan penambahan Fragment melalui FragmentManager di Activity, penggantian dengan BackStack dan pemulihan.

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", "Memuat detail pengguna: $userId")
    }
}

Activity menggunakan supportFragmentManager untuk mengelola fragmen. Transaksi add() dengan BackStack menjamin bahwa saat menekan “Kembali” HomeFragment akan dipulihkan. openDetail() mengganti Fragment saat ini dengan DetailFragment dengan argumen. Pemeriksaan savedInstanceState == null mencegah duplikasi fragmen saat rotasi layar.

Contoh 3: Fragment dengan LifecycleObserver dan StateFlow

Penggunaan Flow dan StateFlow di Fragment dengan viewLifecycleOwner untuk pembaruan UI reaktif.

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", "Hasil pencarian: ${results.size}")
            }
        }
    }

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

Fragment menggunakan View Binding untuk akses ke View. Korutin viewLifecycleOwner.lifecycleScope.launch secara otomatis dibatalkan saat penghancuran View. Binding dinolkan di onDestroyView untuk mencegah kebocoran memori. StateFlow menjamin keakuratan data saat pembuatan ulang View.

Pertanyaan yang sering diajukan

Apa perbedaan onViewCreated dengan onCreateView?

onCreateView — membuat dan mengembalikan View root Fragment. onViewCreated — dipanggil segera setelah pembuatan View, menjamin bahwa View sepenuhnya diinisialisasi dan siap untuk konfigurasi (findViewById, langganan). Google merekomendasikan untuk hanya mengembang layout di onCreateView, dan melakukan semua konfigurasi UI di onViewCreated.

Kapan Fragment benar-benar dihancurkan — onDestroy atau onDetach?

onDestroy — Fragment dihancurkan sebagai objek (ViewModel dibersihkan, korutin dibatalkan). onDetach — callback terakhir, setelahnya Fragment terlepas dari Activity. Praktis semua sumber daya harus dibebaskan di onDestroyView (View) dan onDestroy (Fragment). onDetach — untuk membersihkan referensi ke Activity.

Mengapa Fragment menghilang setelah rotasi layar?

Fragment menghilang jika tidak ditambahkan ke FragmentManager melalui transaksi dengan penyimpanan di BackStack atau jika Activity tidak memulihkan FragmentManager di onCreate. Solusi: tambahkan Fragment secara programatis melalui supportFragmentManager.beginTransaction().add() di onCreate dengan pemeriksaan savedInstanceState == null.

Bisakah Fragment ada tanpa Activity?

Tidak. Fragment selalu terikat pada Activity melalui FragmentManager. Bahkan saat rotasi layar, Activity dibuat ulang dan Fragment terikat kembali ke Activity baru. Membuat Fragment di luar Activity tidak mungkin — konstruktor Fragment memerlukan konstruktor kosong untuk pemulihan oleh sistem.

Apa itu nested fragments dan untuk apa?

Nested fragments (fragmen bersarang) — Fragment di dalam Fragment lain. Digunakan untuk membangun layar kompleks: panel tab, panel dengan tab, master-detail. Fragmen bersarang dikelola oleh FragmentManager anak (childFragmentManager). Google merekomendasikan untuk tidak melebihi 2 tingkat bersarang untuk menghindari masalah kinerja.

Ringkasan

  • Fragment Lifecycle mencakup 11 callback: onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → onPause → onStop → onDestroyView → onDestroy → onDetach.
  • FragmentManager mengelola status Fragment (INITIALIZED → CREATED → STARTED → RESUMED → DESTROYED) dan BackStack transaksi.
  • Fragment bertahan dari rotasi layar — View dihancurkan (onDestroyView), tetapi Fragment dan ViewModel tetap hidup.
  • viewLifecycleOwner — Lifecycle terpisah untuk View Fragment; wajib untuk langganan LiveData dan korutin UI.
  • Penyimpanan status Fragment — melalui onSaveInstanceState atau SavedStateHandle di ViewModel.
  • Transaksi Fragment dilakukan melalui FragmentManager dengan commit() (asinkron) atau commitNow() (sinkron).
  • Selalu nolkan binding dan referensi ke View di onDestroyView untuk mencegah kebocoran memori.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga