Fragment — znovupoužitelná UI komponenta v Androidu, která je vložena do Activity a spravována přes FragmentManager. Každý fragment má vlastní životní cyklus, layout a stav. Fragment usnadňuje přizpůsobení různým velikostem obrazovky a opětovné použití kódu. Více informací naleznete v oficiálním průvodci Google.
Hlavní body
Fragment — modulární komponenta uživatelského rozhraní Android, která představuje část obrazovky uvnitř Activity. Fragment může spravovat vlastní layout, zpracovávat události životního cyklu a ukládat svůj stav. Díky modularitě lze jeden fragment použít v různých Activity a na různých zařízeních.
Fragment API se objevil v Android 3.0 (Honeycomb, API 11) v roce 2011 pro podporu tabletů. Předtím museli vývojáři vytvářet samostatná Activity pro telefon a tablet. Fragment umožnil sestavit obrazovku z nezávislých bloků. V roce 2019 Google vydal knihovnu Jetpack Fragment se zpětnou kompatibilitou až do API 4.
Podle údajů Google (2026) 80% aplikací v Google Play používá Fragment v té či oné formě. Knihovna Jetpack Fragment byla stažena více než 10 miliardkrát prostřednictvím Google Play Services. Fragment zůstává klíčovou komponentou architektury Android i v éře Jetpack Compose.
Životní cyklus Fragmentu je složitější než u Activity, protože závisí na stavu hostitelského Activity. Fragment prochází stejnými stavy jako Activity, ale přidává vlastní callbacky: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Callback Fragmentu | Odpovídá Activity | Účel |
|---|---|---|
| onAttach | před onCreate | Fragment připojen k Activity |
| onCreate | onCreate | Inicializace dat nesouvisejících s UI |
| onCreateView | onCreate | Vytvoření layoutu přes inflater |
| onViewCreated | onCreate | Propojení UI prvků po vytvoření view |
| onDestroyView | onDestroy | Odstranění view, uvolnění UI zdrojů |
| onDetach | onDestroy | Fragment odpojen od Activity |
Hlavní rozdíl životního cyklu Fragmentu — volání onCreateView a onDestroyView mezi onCreate a onDestroy. Fragment může existovat bez UI (pokud onCreateView vrací null). Po opětovném vytvoření Activity FragmentManager fragmenty automaticky obnoví.
FragmentManager — centrální třída pro správu fragmentů v Activity. Zodpovídá za přidávání, odebírání, nahrazování fragmentů, správu zásobníku zpět a obnovu stavu. FragmentManager je dostupný přes supportFragmentManager (AndroidX) nebo fragmentManager (staré API).
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Pokud fragment ještě není přidán — vytvoříme ho
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()
}
}Transakce FragmentTransaction — jsou atomické. commit() naplánuje provedení na další cyklus Looper. Pro okamžité provedení použijte commitNow(). addToBackStack(null) přidá transakci do zásobníku zpět — tlačítko «Zpět» operaci vrátí.
Podívejme se na klíčové metody životního cyklu Fragmentu s příkladem v Kotlinu. onCreateView vytváří layout — na rozdíl od Activity musí metoda vrátit View. onViewCreated je volán hned poté, zde je bezpečné hledat prvky podle id. onDestroyView — poslední okamžik pro vyčištění referencí na 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("Podrobnosti")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}Vzor View Binding s _binding/binding zaručuje, že po onDestroyView je reference na layout vynulována. Přístup k binding po zničení view způsobí NullPointerException. Tento vzor doporučuje Google pro všechny fragmenty.
Pro přenos dat mezi fragmenty nabízí Android několik mechanismů. Neispolehlivější — sdílený ViewModel, který je společný pro fragmenty jednoho Activity. Fragment Result API je vhodný pro jednorázové události. Bundle argumenty — pro data při vytváření fragmentu.
// Sdílený ViewModel pro dva fragmenty
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Fragment A: odesílá událost přes Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// Fragment B: přijímá událost
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (přidán ve Fragment 1.3.0) nahrazuje zastaralé setTargetFragment/onActivityResult. API je typově bezpečné, používá Bundle a nevyžaduje znalost příjemce. Parent FragmentManager funguje jako prostředník mezi fragmenty.
Volba mezi Fragmentem a Activity závisí na architektuře aplikace. Fragment je povinný pro adaptivní layouty (telefon + tablet), vlastní animace přechodů a použití Jetpack Navigation. Activity je vhodnější pro jednoduché aplikace s jednou až dvěma obrazovkami.
| Kritérium | Fragment | Activity |
|---|---|---|
| Rychlost vytvoření | Rychlejší (lehká komponenta) | Pomalejší (systémový proces) |
| Opětovné použití | Vysoké (jeden fragment v různých Activity) | Nízké (každá obrazovka — vlastní Activity) |
| Animace přechodů | Flexibilní (FragmentTransaction) | Omezená (overridePendingTransition) |
| Uložení při otočení | Automatické (správce obnoví) | Ruční (onSaveInstanceState) |
| Deep Links | Přes Navigation Component | Nativní podpora přes intent-filter |
Moderní přístup k práci s Fragmentem — Jetpack Navigation Component, který nahrazuje ruční správu FragmentManager. Knihovna poskytuje NavGraph (XML navigační graf), NavHostFragment a Safe Args pro typově bezpečný přenos dat.
Knihovna Jetpack Fragment (androidx.fragment:fragment-ktx) zahrnuje FragmentResult API, DialogFragment, BottomSheetDialogFragment a integraci s Lifecycle-aware komponentami. Od roku 2026 Google doporučuje používat Fragment pouze přes Jetpack Navigation, ne přímo.
<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="Seznam">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Podrobnosti" />
</navigation>Často kladené otázky
FragmentManager — třída, která spravuje transakce fragmentů. Přidává, odebírá, nahrazuje fragmenty v kontejneru Activity. FragmentManager obnovuje stav fragmentů při opětovném vytvoření Activity a spravuje zásobník zpět.
Fragment — část UI uvnitř Activity, nemůže existovat samostatně. Fragment přežije opětovné vytvoření Activity při otočení obrazovky. Activity — plnohodnotná obrazovka s vlastním Lifecycle, Fragment závisí na Lifecycle Activity.
Fragment — když obrazovka sestává z několika nezávislých bloků (karty, master-detail, přizpůsobení tabletu). Activity — když obrazovka nemá opakující se bloky. Google doporučuje Single Activity + mnoho Fragmentů.
Tři způsoby: přes rodičovské Activity (sdílený ViewModel), přes Fragment Result API (setFragmentResult), přes Bundle argumenty při vytváření Fragmentu. ViewModel — preferovaný způsob, protože data jsou zachována při opětovném vytvoření.
Fragment Transaction — atomická operace změny sady fragmentů. FragmentManager.beginTransaction() otevírá transakci, ve které lze volat add, remove, replace, hide, show. Každá transakce končí commit() nebo commitNow().
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také