Fragment Lifecycle: mga batayan, mga pamamaraan ng onCreateView onViewCreated

May-akda: IT Sectr Nai-publish: 2026-03-04 Oras ng pagbabasa: 12 min

Fragment Lifecycle — isang mahigpit na tinukoy na pagkakasunod-sunod ng mga pamamaraan ng callback na tinatawag ng Android sa buong buhay ng Fragment: mula sa paggawa (onAttach) hanggang sa kumpletong pag-alis (onDetach). Ang Fragment ay may mas kumplikadong siklo ng buhay kaysa sa Activity — kabilang dito ang 11 estado at 7 pangunahing callback. Ang Fragment Lifecycle ay pinamamahalaan sa pamamagitan ng FragmentManager at malapit na nauugnay sa siklo ng buhay ng Activity na naglalaman nito. Ayon sa data ng Google, ang Fragment ay ginagamit sa 74% ng mga Android application na tumatakbo sa API Level 21+, na ginagawang kinakailangan ang pag-unawa sa Fragment Lifecycle para sa propesyonal na pag-develop ng Android. Ang dokumentasyon ng Android tungkol sa Fragment Lifecycle ay naglalarawan ng lahat ng estado at garantiya ng tawag.

Mga pangunahing punto

  • Fragment Lifecycle ay may kasamang 7 callback: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach.
  • Ang FragmentManager ay namamahala ng mga estado ng Fragment at ginagarantiyahan ang tamang pagkakasunod-sunod ng mga tawag sa mga transaksyon.
  • Ang onCreateView at onViewCreated — mga pangunahing pamamaraan para sa paggawa at pagsasaayos ng UI ng Fragment.
  • Ang Fragment ay maaaring mabuhay sa Activity nito (sa pag-ikot ng screen) at ibalik ang estado sa pamamagitan ng onSaveInstanceState.
  • Ang viewLifecycleOwner — isang hiwalay na Lifecycle para sa View ng Fragment, nawasak sa onDestroyView.

Fragment Lifecycle: mga batayan ng siklo ng buhay

Fragment Lifecycle ay isang set ng magkakaugnay na estado at pamamaraan na pinagdadaanan ng bawat instance ng Fragment mula sa sandali ng paggawa hanggang sa pagkawasak. Hindi tulad ng Activity, ang siklo ng buhay ng Fragment ay nakatali sa dalawang konteksto: ang Fragment mismo (nabubuhay mula onAttach hanggang onDetach) at ang View nito (nabubuhay mula onCreateView hanggang onDestroyView). Ang paghihiwalay na ito ay isang pangunahing katangian ng Fragment, na nagpapahintulot na mabuhay sa pagkawasak ng View sa pag-ikot ng screen nang hindi sinisira ang Fragment mismo.

Buong pagkakasunod-sunod ng mga callback ng Fragment:

  • onAttach(Context) — Ang Fragment ay nagkakabit sa Activity. Tinatawag muna. Context — Activity-host.
  • onCreate(Bundle) — Ang Fragment ay sinisimulan. Dito ginagawa ang ViewModel, inaayos ang mga adapter.
  • onCreateView(LayoutInflater, ViewGroup, Bundle) — ang hierarchy ng View ng Fragment ay ginagawa. Ibinabalik ang root View.
  • onViewCreated(View, Bundle) — Ang View ay nagawa. Dito inaayos ang mga elemento ng UI, mga subscription ng LiveData.
  • onStart() — Ang Fragment ay nakikita. Sinisimulan ang mga animation, nirerehistro ang mga sensor.
  • onResume() — Ang Fragment ay aktibo, nakikipag-ugnayan sa gumagamit.
  • onPause() — Ang Fragment ay nawawalan ng focus. Itinitigil ang mga animation.
  • onStop() — Ang Fragment ay hindi nakikita. Pinapalaya ang hindi kritikal na mga mapagkukunan.
  • onDestroyView() — ang hierarchy ng View ay nawasak. Ang mga reference sa View ay ni-zero.
  • onDestroy() — Ang Fragment ay nawasak. Ang mga coroutine na wala sa viewModelScope ay kinakansela.
  • onDetach() — Ang Fragment ay humihiwalay sa Activity. Panghuling paglilinis.

Ayon sa Google, ang karaniwang fragment sa modernong application ay dumadaan sa buong siklo ng 3–5 beses bawat session ng gumagamit (dahil sa mga pag-ikot ng screen at nabigasyon). Ang tamang paghawak ng lahat ng yugto ay batayan ng katatagan ng UI.

Mga estado ng Fragment: mula INITIALIZED hanggang DESTROYED

Ang FragmentManager ay namamahala ng Fragment sa pamamagitan ng limang pangunahing estado, tinukoy sa klase ng Fragment.State. Ang bawat estado ay tumutugma sa isang tiyak na set ng mga callback na naisagawa.

EstadoKahuluganMga naisagawang callback
INITIALIZEDFragment nagawa, ngunit wala pang ViewonAttach, onCreate
CREATEDView nagawa, ngunit hindi nakikita ang Fragment+ onCreateView, onViewCreated
STARTEDFragment nakikita, ngunit hindi aktibo+ onStart
RESUMEDFragment aktibo, nakikipag-ugnayan sa gumagamit+ onResume
DESTROYEDFragment nawasak+ onDestroyView, onDestroy, onDetach

Ang FragmentManager ay naglilipat ng Fragment sa pagitan ng mga estado depende sa mga aksyon ng gumagamit at mga kaganapan ng system. Kapag nagdadagdag ng Fragment sa isang lalagyan, sunod-sunod itong dumadaan sa INITIALIZED → CREATED → STARTED → RESUMED. Kapag inaalis — RESUMED → STARTED → CREATED → DESTROYED.

Ang estado CREATED — espesyal: ang View ay maaaring masira (pagkatapos ng onDestroyView), ngunit ang Fragment mismo ay nananatili sa estado ng CREATED (pagkatapos ng onDestroyView, bago ang onDestroy). Ito ay nagpapahintulot sa FragmentManager na panatilihin ang Fragment sa memorya nang walang View, na kinakailangan para mabuhay sa mga pag-ikot ng screen.

Pagkakaiba ng Fragment Lifecycle at Activity Lifecycle

Ang Fragment Lifecycle at Activity Lifecycle ay malapit na nauugnay, ngunit may mga pangunahing pagkakaiba. Ang Fragment ay laging nabubuhay sa loob ng Activity, at ang siklo ng buhay nito ay nakasalalay sa Activity-host, ngunit hindi katulad nito.

AspektoActivityFragment
Bilang ng mga callback7 (onCreate … onDestroy)11 (onAttach … onDetach)
Hiwalay na Lifecycle para sa ViewHindiOo (viewLifecycleOwner)
Nabubuhay sa pag-ikotHindi (nasira)Oo (ViewModel + Fragment nabubuhay)
Pag-asa sa hostHindiNakadepende sa Activity Lifecycle
Pag-save ng estadoonSaveInstanceStateonSaveInstanceState (fragment)
PamamahalaSistemaFragmentManager

Pangunahing praktikal na pagkakaiba: sa pag-ikot ng screen, ang Activity ay ganap na nawasak (onDestroy) at ginawang muli (onCreate). Ang Fragment sa pag-ikot ay dumadaan sa onDestroyView (View ay nawasak) → onCreateView (View ay ginawang muli), ngunit ang Fragment mismo at ang ViewModel nito ay nananatiling buhay. Ginagawa nitong perpektong lalagyan ang Fragment para sa lohika ng UI na dapat mabuhay sa mga pagbabago sa konpigurasyon.

Pagkakasunod-sunod ng mga tawag sa pag-ikot ng screen: Activity.onPause → Fragment.onPause → Activity.onStop → Fragment.onStop → Activity.onDestroy → Fragment.onDestroyView → (Activity nawasak) → Activity.onCreate → Fragment.onAttach → Fragment.onCreate → Fragment.onCreateView → Fragment.onViewCreated → Activity.onStart → Fragment.onStart → Activity.onResume → Fragment.onResume.

FragmentManager: pamamahala ng mga estado at transaksyon

FragmentManager — ang sentral na klase na responsable para sa pagdaragdag, pag-alis, pagpapalit ng mga fragment at pamamahala ng kanilang mga estado. Ang FragmentManager ay nagpapanatili ng stack ng BackStack at ginagarantiyahan ang tamang pagkakasunod-sunod ng mga callback sa mga transaksyon. Ang bawat Activity at bawat nested Fragment ay may sariling FragmentManager.

Pangunahing operasyon ng FragmentManager:

  • beginTransaction() — nagbubukas ng transaksyon para sa isang grupo ng mga operasyon.
  • add() — nagdaragdag ng Fragment sa isang lalagyan. Fragment dumadaan sa buong lifecycle hanggang RESUMED.
  • replace() — pinapalitan ang kasalukuyang Fragment ng bago. katumbas ng remove() + add().
  • remove() — nag-aalis ng Fragment. Fragment dumadaan sa lifecycle mula RESUMED hanggang DESTROYED.
  • hide()/show() — nagtatago/nagpapakita ng Fragment nang hindi sinisira ang View. Fragment napupunta sa STARTED sa hide, pabalik sa RESUMED sa show.
  • detach()/attach() — nagtatanggal/nagkakabit ng Fragment. detach sinisira ang View (onDestroyView), attach ginagawang muli (onCreateView).
  • addToBackStack() — nagdaragdag ng transaksyon sa BackStack para sa posibilidad ng pag-navigate “Bumalik”.

BackStack — stack ng mga transaksyon ng FragmentManager. Kapag pinindot ang system button na “Bumalik”, ang huling transaksyon sa BackStack ay binabaligtad (popBackStack()). Ang Fragment na inalis sa pamamagitan ng popBackStack ay naibabalik. Kung walang laman ang BackStack, ang pagpindot sa “Bumalik” ay nagtatapos sa Activity.

Ayon sa Google, 78% ng mga problema sa Fragment (pagdoble, mga blangkong screen, IllegalStateException) ay nauugnay sa hindi tamang paggamit ng FragmentManager. Pangunahing panuntunan: isagawa ang mga transaksyon sa pamamagitan ng commit() (asynchronously) o commitNow() (synchronously) depende sa konteksto. Ang commit() ay ginagarantiyahan ang tamang pagkakasunod-sunod sa maraming transaksyon.

Pag-save ng estado ng Fragment: onSaveInstanceState

Ang Fragment ay sumusuporta sa sarili nitong mekanismo ng pag-save ng estado sa pamamagitan ng onSaveInstanceState, na gumagana nang independyente sa Activity. Ang Fragment ay nagse-save ng estado sa Bundle, na ipinapasa sa onCreate at onCreateView sa pagpapanumbalik.

Kailan nagse-save ng estado ang Fragment:

  • Sa pag-ikot ng screen — View ay nawasak, Fragment nagse-save ng estado sa Bundle.
  • Sa paglakip ng Fragment sa Activity pagkatapos ng process death.
  • Sa pagtawag ng onSaveInstanceState mula sa Activity (sistema nagpapalaganap ng pag-save sa lahat ng anak na fragment).

Makabagong diskarte: gamitin ang SavedStateHandle sa ViewModel para sa pag-save ng estado ng Fragment. Ang SavedStateHandle ay awtomatikong nagse-save at nagpapanumbalik ng data sa pag-ikot ng screen at process death, nang hindi nangangailangan ng manu-manong onSaveInstanceState. Inirerekomenda ng Google ang SavedStateHandle bilang ginustong paraan ng pag-save ng estado ng UI sa Fragment.

setRetainInstance (luma na mula Fragment 1.3): dati ang Fragment ay maaaring mapanatili sa pamamagitan ng setRetainInstance(true) sa pag-ikot ng screen. Ang diskarteng ito ay pinalitan ng ViewModel + SavedStateHandle, na mas maaasahan at hindi nangangailangan ng espesyal na pagsasaayos.

viewLifecycleOwner: hiwalay na siklo ng buhay ng View

viewLifecycleOwner — Lifecycle na nakatali sa View ng Fragment (mula onCreateView hanggang onDestroyView). Ito ay isang pangunahing mahalagang konsepto: ang mga subscription ng LiveData/Flow na ginawa sa pamamagitan ng viewLifecycleOwner ay awtomatikong kinakansela sa pagkawasak ng View (onDestroyView), ngunit hindi naaapektuhan ang Fragment mismo.

Pagkakaiba ng viewLifecycleOwner at lifecycle ng Fragment:

  • lifecycle (Fragment) — nabubuhay mula onAttach hanggang onDetach. Ang mga subscription ay nananatiling aktibo kahit pagkatapos ng pagkawasak ng View.
  • viewLifecycleOwner — nabubuhay mula onCreateView hanggang onDestroyView. Ang mga subscription ay kinakansela sa pagkawasak ng View.

Bakit ito mahalaga: kung mag-subscribe ka sa LiveData sa pamamagitan ng lifecycle ng Fragment (this), pagkatapos ng onDestroyView ang subscription ay nananatiling aktibo at LiveData ay susubukang i-update ang null View, na nagdudulot ng NPE. Ang subscription sa pamamagitan ng viewLifecycleOwner ay ginagarantiyahan na pagkatapos ng onDestroyView walang magaganap na UI update.

Panuntunan: sa Fragment, laging gamitin ang viewLifecycleOwner para sa mga subscription ng LiveData, Flow at coroutine na may kaugnayan sa UI. Para sa mga coroutine ng ViewModel, gamitin ang viewModelScope — ito ay nakatali sa ViewModel, hindi sa Fragment.

Mga halimbawa ng code ng Fragment sa Kotlin

Halimbawa 1: Pangunahing Fragment na may onViewCreated at viewLifecycleOwner

Nagpapakita ng tamang pagsisimula ng UI at subscription ng LiveData sa pamamagitan ng 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", "Pag-update ng listahan: ${users.size} mga gumagamit")
        }
    }

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

Ang Fragment ay nagpapalaki ng layout sa onCreateView, nag-aayos ng UI at nag-subscribe sa LiveData sa onViewCreated. Ang subscription sa pamamagitan ng viewLifecycleOwner — isang sapilitang kinakailangan para maiwasan ang pagtagas ng memorya. Ang onDestroyView ay nag-log ng pagkawasak ng View — kumpirmasyon na ang Fragment ay nabubuhay sa pag-ikot ng screen.

Halimbawa 2: Fragment na may FragmentManager at mga transaksyon

Nagpapakita ng pagdaragdag ng Fragment sa pamamagitan ng FragmentManager sa Activity, pagpapalit ng BackStack at pagpapanumbalik.

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", "Pag-load ng mga detalye ng gumagamit: $userId")
    }
}

Ang Activity ay gumagamit ng supportFragmentManager para sa pamamahala ng mga fragment. Ang transaksyon na add() na may BackStack ay ginagarantiyahan na sa pagpindot ng “Bumalik” ang HomeFragment ay maibabalik. Ang openDetail() ay pinapalitan ang kasalukuyang Fragment ng DetailFragment na may mga argumento. Ang pagsusuri ng savedInstanceState == null ay pumipigil sa pagdoble ng mga fragment sa pag-ikot ng screen.

Halimbawa 3: Fragment na may LifecycleObserver at StateFlow

Paggamit ng Flow at StateFlow sa Fragment na may viewLifecycleOwner para sa reaktibong pag-update ng UI.

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", "Mga resulta ng paghahanap: ${results.size}")
            }
        }
    }

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

Ang Fragment ay gumagamit ng View Binding para sa pag-access sa View. Ang coroutine na viewLifecycleOwner.lifecycleScope.launch ay awtomatikong kinakansela sa pagkawasak ng View. Ang Binding ay ni-zero sa onDestroyView upang maiwasan ang pagtagas ng memorya. Ang StateFlow ay ginagarantiyahan ang pagiging napapanahon ng data sa muling paggawa ng View.

Mga madalas itanong

Paano naiiba ang onViewCreated sa onCreateView?

onCreateView — gumagawa at nagbabalik ng root View ng Fragment. onViewCreated — tinatawag kaagad pagkatapos gawin ang View, ginagarantiyahan na ang View ay ganap na nasimulan at handa na para sa pagsasaayos (findViewById, mga subscription). Inirerekomenda ng Google na sa onCreateView ay palakihin lamang ang layout, at gawin ang lahat ng pagsasaayos ng UI sa onViewCreated.

Kailan talaga nawasak ang Fragment — onDestroy o onDetach?

onDestroy — Ang Fragment ay nawasak bilang isang bagay (ViewModel ay nililinis, mga coroutine ay kinakansela). onDetach — huling callback, pagkatapos nito ang Fragment ay humihiwalay sa Activity. Praktikal lahat ng mapagkukunan ay dapat palayain sa onDestroyView (View) at onDestroy (Fragment). onDetach — para sa paglilinis ng mga reference sa Activity.

Bakit nawawala ang Fragment pagkatapos ng pag-ikot ng screen?

Nawawala ang Fragment kung hindi ito naidagdag sa FragmentManager sa pamamagitan ng transaksyon na may pag-save sa BackStack o kung hindi ibinabalik ng Activity ang FragmentManager sa onCreate. Solusyon: idagdag ang Fragment nang programmatically sa pamamagitan ng supportFragmentManager.beginTransaction().add() sa onCreate na may pagsusuri ng savedInstanceState == null.

Maaari bang umiral ang Fragment nang walang Activity?

Hindi. Ang Fragment ay laging nakatali sa Activity sa pamamagitan ng FragmentManager. Kahit sa pag-ikot ng screen, ang Activity ay ginagawang muli at ang Fragment ay muling nakakabit sa bagong Activity. Ang paggawa ng Fragment sa labas ng Activity ay imposible — ang constructor ng Fragment ay nangangailangan ng walang laman na constructor para sa pagpapanumbalik ng sistema.

Ano ang nested fragments at para saan ang mga ito?

Nested fragments (mga nested na fragment) — Fragment sa loob ng isa pang Fragment. Ginagamit para sa pagbuo ng mga kumplikadong screen: mga panel ng tab, mga panel na may mga tab, master-detail. Ang mga nested na fragment ay pinamamahalaan ng child FragmentManager (childFragmentManager). Inirerekomenda ng Google na huwag lumampas sa 2 antas ng nesting upang maiwasan ang mga problema sa pagganap.

Buod

  • Fragment Lifecycle ay may kasamang 11 callback: onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → onPause → onStop → onDestroyView → onDestroy → onDetach.
  • Ang FragmentManager ay namamahala ng mga estado ng Fragment (INITIALIZED → CREATED → STARTED → RESUMED → DESTROYED) at BackStack ng mga transaksyon.
  • Ang Fragment ay nabubuhay sa pag-ikot ng screen — View ay nawasak (onDestroyView), ngunit ang Fragment at ViewModel ay nananatiling buhay.
  • Ang viewLifecycleOwner — hiwalay na Lifecycle para sa View ng Fragment; sapilitan para sa mga subscription ng LiveData at UI coroutine.
  • Pag-save ng estado ng Fragment — sa pamamagitan ng onSaveInstanceState o SavedStateHandle sa ViewModel.
  • Ang mga transaksyon ng Fragment ay isinasagawa sa pamamagitan ng FragmentManager na may commit() (asynchronously) o commitNow() (synchronously).
  • Palaging i-zero ang binding at mga reference sa View sa onDestroyView upang maiwasan ang pagtagas ng memorya.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din