Fragment: ce este, fragmente și FragmentManager în Android

Autor: IT Sectr Publicat: 2026-02-22 Timp de citire: 7 min

Fragment — o componentă UI reutilizabilă în Android, care este încorporată în Activity și gestionată prin FragmentManager. Fiecare fragment are propriul ciclu de viață, layout și stare. Fragment simplifică adaptarea la diferite dimensiuni de ecran și reutilizarea codului. Citiți mai multe în ghidul oficial Google.

Principalele puncte

  • Fragment — componentă UI în interiorul Activity cu propriul ciclu de viață și layout
  • FragmentManager — clasă pentru gestionarea tranzacțiilor fragmentelor și stivei de revenire
  • FragmentTransaction — operație atomică de adăugare, înlocuire sau ștergere a fragmentelor
  • Jetpack Fragment — bibliotecă pentru compatibilitate inversă până la Android 1.6 (API 4)
  • ViewModel — componentă partajată pentru schimbul de date între fragmente în același Activity

Ce este Fragment?

Fragment — o componentă modulară a interfeței de utilizator Android care reprezintă o parte a ecranului în interiorul Activity. Fragment poate gestiona propriul layout, poate procesa evenimente ale ciclului de viață și își poate salva starea. Datorită modularității, un fragment poate fi utilizat în diferite Activity și pe diferite dispozitive.

Fragment API a apărut în Android 3.0 (Honeycomb, API 11) în 2011 pentru suportul tabletelor. Înainte de aceasta, dezvoltatorii trebuiau să creeze Activity separate pentru telefon și tabletă. Fragment a permis asamblarea ecranului din blocuri independente. În 2019, Google a lansat biblioteca Jetpack Fragment cu compatibilitate inversă până la API 4.

Conform datelor Google (2026), 80% din aplicațiile din Google Play folosesc Fragment într-o formă sau alta. Biblioteca Jetpack Fragment a fost descărcată de peste 10 miliarde de ori prin Google Play Services. Fragment rămâne o componentă cheie a arhitecturii Android chiar și în era Jetpack Compose.

Ciclul de viață al Fragment

Ciclul de viață al Fragment este mai complex decât al Activity, deoarece depinde de starea Activity-gazdă. Fragment trece prin aceleași stări ca și Activity, dar adaugă propriile callback-uri: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Callback FragmentCorespondent ActivityScop
onAttachînainte de onCreateFragment atașat la Activity
onCreateonCreateInițializarea datelor nelegate de UI
onCreateViewonCreateCrearea layout-ului prin inflater
onViewCreatedonCreateLegarea elementelor UI după crearea view-ului
onDestroyViewonDestroyȘtergerea view-ului, eliberarea resurselor UI
onDetachonDestroyFragment detașat de Activity

Comparația Lifecycle Fragment și Activity

Diferența principală a ciclului de viață al Fragment — apelul onCreateView și onDestroyView între onCreate și onDestroy. Fragment poate exista fără UI (dacă onCreateView returnează null). După recrearea Activity, FragmentManager restaurează fragmentele automat.

FragmentManager și tranzacții

FragmentManager — clasa centrală pentru gestionarea fragmentelor în Activity. Răspunde de adăugarea, ștergerea, înlocuirea fragmentelor, gestionarea stivei de revenire și restaurarea stării. FragmentManager este accesibil prin supportFragmentManager (AndroidX) sau fragmentManager (API vechi).

kotlin
class MainActivity : AppCompatActivity() {

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

        // Dacă fragmentul nu a fost încă adăugat — îl creăm
        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()
    }
}

Tranzacțiile FragmentTransaction — sunt atomice. commit() programează execuția pentru următorul ciclu Looper. Pentru execuție imediată, utilizați commitNow(). addToBackStack(null) adaugă tranzacția în stiva de revenire — butonul «Înapoi» va anula operația.

Metodele ciclului de viață al Fragment

Să examinăm metodele cheie ale ciclului de viață al Fragment cu un exemplu în Kotlin. onCreateView creează layout-ul — spre deosebire de Activity, metoda trebuie să returneze View. onViewCreated este apelat imediat după, aici este sigur să găsiți elemente după id. onDestroyView — ultimul moment pentru curățarea referințelor către view.

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("Detalii")
    }

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

Modelul View Binding cu _binding/binding garantează că după onDestroyView referința către layout este anulată. Accesarea binding după distrugerea view-ului va provoca NullPointerException. Acest model este recomandat de Google pentru toate fragmentele.

Transmiterea datelor între fragmente

Pentru transmiterea datelor între fragmente, Android oferă mai multe mecanisme. Cel mai fiabil — ViewModel partajat, împărțit între fragmentele aceluiași Activity. Fragment Result API este potrivit pentru evenimente unice. Argumentele Bundle — pentru date la crearea fragmentului.

kotlin
// ViewModel partajat pentru două fragmente
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

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

// Fragment A: trimite eveniment prin Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))

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

Fragment Result API (adăugat în Fragment 1.3.0) înlocuiește setTargetFragment/onActivityResult învechite. API-ul este type-safe, folosește Bundle și nu necesită cunoașterea destinatarului. Parent FragmentManager acționează ca intermediar între fragmente.

Fragment vs Activity: când să alegi ce

Alegerea între Fragment și Activity depinde de arhitectura aplicației. Fragment este obligatoriu pentru layout-uri adaptive (telefon + tabletă), pentru animații personalizate de tranziție și pentru utilizarea Jetpack Navigation. Activity este preferabil pentru aplicații simple cu una-două ecrane.

CriteriuFragmentActivity
Viteza de creareMai rapid (componentă ușoară)Mai lent (proces de sistem)
ReutilizareRidicată (un fragment în diferite Activity)Scăzută (fiecare ecran — propriul Activity)
Animația tranzițiilorFlexibilă (FragmentTransaction)Limitată (overridePendingTransition)
Salvarea la rotireAutomată (managerul restaurează)Manuală (onSaveInstanceState)
Deep LinksPrin Navigation ComponentSuport nativ prin intent-filter

Jetpack Fragment și Jetpack Navigation

Abordarea modernă de lucru cu Fragment — Jetpack Navigation Component, care înlocuiește gestionarea manuală a FragmentManager. Biblioteca oferă NavGraph (graf de navigare XML), NavHostFragment și Safe Args pentru transmiterea type-safe a datelor.

Biblioteca Jetpack Fragment (androidx.fragment:fragment-ktx) include FragmentResult API, DialogFragment, BottomSheetDialogFragment și integrare cu componente Lifecycle-aware. Din 2026, Google recomandă utilizarea Fragment doar prin Jetpack Navigation, nu direct.

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

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Detalii" />
</navigation>

Întrebări frecvente

FragmentManager — ce este?

FragmentManager — clasă care gestionează tranzacțiile fragmentelor. Adaugă, șterge, înlocuiește fragmente în containerul Activity. FragmentManager restaurează starea fragmentelor la recrearea Activity și gestionează stiva de revenire.

Cu ce se deosebește Fragment de Activity?

Fragment — parte a UI în interiorul Activity, nu poate exista independent. Fragment supraviețuiește recreării Activity la rotirea ecranului. Activity — ecran complet cu propriul Lifecycle, Fragment depinde de Lifecycle Activity.

Când să folosești Fragment în loc de Activity?

Fragment — când ecranul constă din mai multe blocuri independente (tab-uri, master-detail, adaptare pentru tabletă). Activity — când ecranul nu are blocuri repetitive. Google recomandă Single Activity + multiple Fragment.

Cum să transmiți date între Fragment?

Trei moduri: prin Activity părinte (ViewModel partajat), prin Fragment Result API (setFragmentResult), prin argumente Bundle la crearea Fragment. ViewModel — modul preferat, deoarece datele se păstrează la recreare.

Ce este Fragment Transaction?

Fragment Transaction — operație atomică de modificare a setului de fragmente. FragmentManager.beginTransaction() deschide o tranzacție în care se poate apela add, remove, replace, hide, show. Fiecare tranzacție se încheie cu commit() sau commitNow().

Rezumat

  • Fragment — componentă UI reutilizabilă în interiorul Activity cu propriul ciclu de viață, layout și stare
  • FragmentManager gestionează tranzacțiile fragmentelor și le restaurează starea la recrearea Activity
  • FragmentTransaction — operație atomică pentru adăugarea, înlocuirea, ștergerea și ascunderea fragmentelor
  • Ciclul de viață al Fragment include șase callback-uri, de la onAttach la onDetach, cu punctul suplimentar onCreateView
  • ViewModel — modul recomandat de schimb de date între fragmente în același Activity
  • Fragment Result API asigură transmiterea type-safe a evenimentelor unice între fragmente

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și