Fragment — újrafelhasználható UI komponens Androidban, amely Activity-be ágyazódik és FragmentManager-en keresztül kezelődik. Minden fragmentumnak saját életciklusa, layout-ja és állapota van. A Fragment megkönnyíti a különböző képernyőméretekhez való alkalmazkodást és a kód újrafelhasználását. További információért olvassa el a Google hivatalos útmutatóját.
Főbb pontok
Fragment — moduláris Android felhasználói felület komponens, amely a képernyő egy részét képviseli az Activity-n belül. A Fragment kezelheti saját layout-ját, feldolgozhatja az életciklus eseményeket és elmentheti állapotát. A modularitásnak köszönhetően egy fragmentum különböző Activity-kben és különböző eszközökön használható.
A Fragment API Android 3.0-ban (Honeycomb, API 11) jelent meg 2011-ben a tabletek támogatására. Ezt megelőzően a fejlesztőknek külön Activity-t kellett létrehozniuk telefonra és tablet-re. A Fragment lehetővé tette a képernyő független blokkokból való összeállítását. 2019-ben a Google kiadta a Jetpack Fragment könyvtárat visszafelé kompatibilitással API 4-ig.
A Google adatai szerint (2026) a Google Play alkalmazásainak 80%-a használja a Fragment-et valamilyen formában. A Jetpack Fragment könyvtárat több mint 10 milliárdszor töltötték le a Google Play Services-en keresztül. A Fragment még a Jetpack Compose korszakában is az Android architektúra kulcsfontosságú komponense marad.
A Fragment életciklusa bonyolultabb, mint az Activity-é, mivel függ a gazda Activity állapotától. A Fragment ugyanazokon az állapotokon megy keresztül, mint az Activity, de saját callback-eket ad hozzá: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Fragment callback | Activity megfelelés | Cél |
|---|---|---|
| onAttach | onCreate előtt | Fragment az Activity-hez kapcsolódott |
| onCreate | onCreate | Nem UI-hoz kapcsolódó adatok inicializálása |
| onCreateView | onCreate | Layout létrehozása inflater-en keresztül |
| onViewCreated | onCreate | UI elemek kötése a view létrehozása után |
| onDestroyView | onDestroy | View eltávolítása, UI erőforrások felszabadítása |
| onDetach | onDestroy | Fragment lekapcsolódott az Activity-ről |
A Fragment életciklusának fő különbsége — az onCreateView és onDestroyView meghívása az onCreate és onDestroy között. A Fragment létezhet UI nélkül (ha az onCreateView null-t ad vissza). Az Activity újralétrehozása után a FragmentManager automatikusan visszaállítja a fragmentumokat.
FragmentManager — központi osztály a fragmentumok Activity-n belüli kezelésére. Felelős a fragmentumok hozzáadásáért, eltávolításáért, cseréjéért, a visszalépési verem kezeléséért és az állapot visszaállításáért. A FragmentManager a supportFragmentManager-en (AndroidX) vagy fragmentManager-en (régi API) keresztül érhető el.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Ha a fragmentum még nincs hozzáadva — létrehozzuk
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()
}
}A FragmentTransaction tranzakciói — atomiak. A commit() a következő Looper ciklusra ütemezi a végrehajtást. Azonnali végrehajtáshoz használja a commitNow()-t. Az addToBackStack(null) hozzáadja a tranzakciót a visszalépési veremhez — a «Vissza» gomb visszavonja a műveletet.
Vizsgáljuk meg a Fragment életciklusának kulcsfontosságú metódusait Kotlin példával. Az onCreateView létrehozza a layout-ot — az Activity-vel ellentétben a metódusnak View-t kell visszaadnia. Az onViewCreated közvetlenül utána hívódik, itt biztonságos az elemek id alapján történő keresése. Az onDestroyView — az utolsó pillanat a view referenciák tisztítására.
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("Részletek")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}A View Binding minta _binding/binding használatával garantálja, hogy az onDestroyView után a layout referencia nullázódik. A binding elérése a view megsemmisítése után NullPointerException-t okoz. Ezt a mintát a Google ajánlja minden fragmentumhoz.
Az adatátvitelhez fragmentumok között az Android több mechanizmust kínál. A legmegbízhatóbb — megosztott ViewModel, amely egy Activity fragmentumai között osztható meg. A Fragment Result API egyszeri eseményekhez alkalmas. A Bundle argumentumok — adatokhoz a fragmentum létrehozásakor.
// Megosztott ViewModel két fragmentumhoz
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// A Fragment: eseményt küld a Fragment Result API-n keresztül
setFragmentResult("request_key", bundleOf("key" to "value"))
// B Fragment: fogadja az eseményt
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}A Fragment Result API (Fragment 1.3.0-ban hozzáadva) leváltja az elavult setTargetFragment/onActivityResult-ot. Az API type-safe, Bundle-t használ, és nem igényli a címzett ismeretét. A Parent FragmentManager közvetítőként működik a fragmentumok között.
A Fragment és Activity közötti választás az alkalmazás architektúrájától függ. A Fragment kötelező az adaptív layout-okhoz (telefon + tablet), egyéni átmeneti animációkhoz és a Jetpack Navigation használatához. Az Activity egyszerű, egy-két képernyős alkalmazásokhoz előnyösebb.
| Szempont | Fragment | Activity |
|---|---|---|
| Létrehozás sebessége | Gyorsabb (könnyű komponens) | Lassabb (rendszerfolyamat) |
| Újrafelhasználás | Magas (egy fragmentum különböző Activity-kben) | Alacsony (minden képernyő — saját Activity) |
| Átmeneti animáció | Rugalmas (FragmentTransaction) | Korlátozott (overridePendingTransition) |
| Mentés elforgatáskor | Automatikus (kezelő visszaállítja) | Kézi (onSaveInstanceState) |
| Deep Links | Navigation Component-en keresztül | Natív támogatás intent-filter-en keresztül |
A Fragment-tel való munkavégzés modern megközelítése — a Jetpack Navigation Component, amely leváltja a FragmentManager kézi kezelését. A könyvtár NavGraph-ot (XML navigációs gráf), NavHostFragment-et és Safe Args-ot biztosít type-safe adatátvitelhez.
Jetpack Fragment könyvtár (androidx.fragment:fragment-ktx) tartalmazza a FragmentResult API-t, DialogFragment-et, BottomSheetDialogFragment-et és integrációt Lifecycle-aware komponensekkel. 2026-tól a Google azt ajánlja, hogy a Fragment-et csak Jetpack Navigation-en keresztül használjuk, ne közvetlenül.
<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="Lista">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Részletek" />
</navigation>Gyakran ismételt kérdések
FragmentManager — osztály, amely a fragmentum-tranzakciókat kezeli. Hozzáadja, eltávolítja, cseréli a fragmentumokat az Activity konténerében. A FragmentManager visszaállítja a fragmentumok állapotát az Activity újralétrehozásakor és kezeli a visszalépési vermet.
Fragment — az UI része az Activity-n belül, nem létezhet önállóan. A Fragment túléli az Activity újralétrehozását képernyőelforgatáskor. Az Activity — teljes képernyő saját Lifecycle-lel, a Fragment függ az Activity Lifecycle-étől.
Fragment — amikor a képernyő több független blokkból áll (lapok, master-detail, alkalmazkodás tablethez). Activity — amikor a képernyőn nincsenek ismétlődő blokkok. A Google a Single Activity + több Fragment kombinációt ajánlja.
Három módon: szülő Activity-n keresztül (megosztott ViewModel), Fragment Result API-n keresztül (setFragmentResult), Bundle argumentumokon keresztül a Fragment létrehozásakor. A ViewModel — preferált módszer, mivel az adatok megőrződnek újralétrehozáskor.
Fragment Transaction — atomi művelet a fragmentumok halmazának megváltoztatására. A FragmentManager.beginTransaction() megnyit egy tranzakciót, amelyben add, remove, replace, hide, show hívható. Minden tranzakció commit() vagy commitNow() hívással végződik.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is