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 — 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 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 Fragment | Corespondent Activity | Scop |
|---|---|---|
| onAttach | înainte de onCreate | Fragment atașat la Activity |
| onCreate | onCreate | Inițializarea datelor nelegate de UI |
| onCreateView | onCreate | Crearea layout-ului prin inflater |
| onViewCreated | onCreate | Legarea elementelor UI după crearea view-ului |
| onDestroyView | onDestroy | Ștergerea view-ului, eliberarea resurselor UI |
| onDetach | onDestroy | Fragment detașat de 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 — 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).
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.
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.
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.
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.
// 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.
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.
| Criteriu | Fragment | Activity |
|---|---|---|
| Viteza de creare | Mai rapid (componentă ușoară) | Mai lent (proces de sistem) |
| Reutilizare | Ridicată (un fragment în diferite Activity) | Scăzută (fiecare ecran — propriul Activity) |
| Animația tranzițiilor | Flexibilă (FragmentTransaction) | Limitată (overridePendingTransition) |
| Salvarea la rotire | Automată (managerul restaurează) | Manuală (onSaveInstanceState) |
| Deep Links | Prin Navigation Component | Suport nativ prin intent-filter |
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.
<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 — 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.
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.
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.
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.
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
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.
Citiți și