TopAppBar: co to je, nastavení a použití v Jetpack Compose

Autor: IT Sectr Publikováno: 2026-06-29 Doba čtení: 8 min

TopAppBar je komponenta Material Designu, která zobrazuje horní panel aplikace s titulkem, navigačním tlačítkem a dalšími akcemi. V Jetpack Compose je TopAppBar implementován pomocí composable funkce TopAppBar z knihovny Material. Podle oficiální dokumentace Android Developers (2025) TopAppBar podporuje Material2 a Material3, včetně adaptivní výšky, barev a animací. Panel se automaticky přizpůsobuje systémovému stavovému řádku a správně pracuje s Insets. TopAppBar se používá jako hlavní vstupní bod pro navigaci a kontextové akce v Android aplikacích.

Hlavní body

  • TopAppBar — composable komponenta Material Designu pro horní panel aplikace v Jetpack Compose
  • Parametry zahrnují title, navigationIcon, actions a modifikátory pro flexibilní nastavení
  • Material3 poskytuje TopAppBar s podporou dynamic color a adaptivních okrajů
  • Navigační tlačítko se používá k otevření Drawer nebo návratu na předchozí obrazovku
  • ScrollBehavior umožňuje skrýt TopAppBar při posouvání obsahu pro úsporu místa

Co je TopAppBar v Jetpack Compose?

TopAppBar je composable funkce z knihovny Material Design pro Jetpack Compose, která implementuje horní panel aplikace (App Bar). Komponenta zobrazuje titulek aktuální obrazovky, navigační tlačítko vlevo a další akce vpravo.

Na rozdíl od klasického systému View je verze TopAppBar v Compose plně deklarativní: panel se překresluje při změně stavu a není spravován pomocí findViewById. TopAppBar používá koncept slot API, kde jsou title, navigationIcon a actions předávány jako composable lambdy. To umožňuje přizpůsobit libovolný prvek panelu bez dědičnosti.

Podle Google Material Design (2025) existuje TopAppBar v Compose ve třech typech: CenterAlignedTopAppBar (centrovaný titulek), SmallTopAppBar (standardní) a MediumTopAppBar (rozšířený). Každý typ určuje výšku panelu, velikost písma titulku a chování při posouvání. Centrovaná varianta se častěji používá na hlavních obrazovkách a MediumTopAppBar pro stránky s obsahem, kde se titulek při posouvání postupně zmenšuje.

Pro správnou funkci TopAppBar je třeba zohlednit systémové okraje: Insets z WindowInsetsCompat. Podle doporučení Android Developers (2025) volání Modifier.statusBarsPadding() nebo windowInsetsPadding(WindowInsets.systemBars) zabraňuje překrývání panelu se stavovým řádkem.

Parametry TopAppBar: nastavení titulku a modifikátorů

Komponenta TopAppBar přijímá řadu povinných a volitelných parametrů. Hlavním je title, do kterého se předává composable blok s textem titulku. Protože title je @Composable lambda, lze vložit nejen text, ale také ikonu s textem, vyhledávací pole nebo indikátor průběhu.

kotlin
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AppTopBar() {
    TopAppBar(
        title = { Text("Hlavní") },
        navigationIcon = {
            IconButton(onClick = { /* open drawer */ }) {
                Icon(
                    Icons.Filled.Menu,
                    contentDescription = "Menu"
                )
            }
        },
        actions = {
            IconButton(onClick = { /* search */ }) {
                Icon(Icons.Filled.Search, contentDescription = "Search")
            }
        }
    )
}

Parametr Modifier umožňuje nastavit okraje, velikost a zarovnání celého panelu. Pomocí Modifier.heightIn lze omezit minimální a maximální výšku. Parametr colors přijímá objekt TopAppBarColors pro přepsání barev pozadí, titulku a ikon.

Ve výchozím nastavení TopAppBar používá barevné schéma z aktuálního MaterialTheme. Pokud je potřeba vlastní paleta, použijte TopAppBarDefaults.smallTopAppBarColors(). V Material3 se barva pozadí automaticky přizpůsobuje surfaceColor ve světlém a tmavém režimu, což eliminuje potřebu ručního nastavení.

ParametrTypPopis
title@Composable () -> UnitBlok titulku panelu
navigationIcon@Composable () -> UnitIkona navigace (hamburger/šipka)
actions@Composable RowScope.() -> UnitBlok akcí vpravo
scrollBehaviorTopAppBarScrollBehavior?Chování při posouvání
colorsTopAppBarColorsBarevné schéma panelu

NavigationIcon je composable blok v levé části TopAppBar, přes který se implementuje navigace. Typické scénáře: otevření Navigation Drawer (ikona Menu), návrat na předchozí obrazovku (ikona ArrowBack) nebo zavření aktuální obrazovky (ikona Close).

Výběr ikony závisí na pozici obrazovky v navigačním zásobníku. Pokud je obrazovka kořenová — zobrazí se ikona Menu pro otevření Drawer. Pokud je obrazovka vnořená — ikona ArrowBack pro návrat. V Compose je tato logika implementována pomocí NavController: aktuální záznam back stack určuje, která ikona se zobrazí.

Podle doporučení Material Design (2025) je šířka navigační oblasti 48 dp — standardní cíl pro dotykovou interakci. Ikona musí být klikatelná s vizuální zpětnou vazbou (ripple). V Compose je to zajištěno zabalením do IconButton s callbackem onClick, který spouští navigaci.

Při použití Scaffold může navigační tlačítko duplikovat DrawerState, který je předáván Scaffoldu, nikoli přímo TopAppBar. V tomto případě navigationIcon odkazuje na stav Drawer přes rememberDrawerState.

Přidání akcí a rozbalovacího menu

Parametr actions v TopAppBar přijímá composable blok s kontextem RowScope, což umožňuje umístit několik ikon nebo tlačítek vpravo od titulku. Každá akce by měla být klikatelný ikonografický prvek: vyhledávání, oznámení, nastavení, oblíbené.

Pro přetékající akce se používá rozbalovací menu přes DropdownMenu. Pokud počet akcí přesáhne tři, přebytečné jsou umístěny do OverflowMenu s ikonou MoreVert. Po stisknutí se otevře seznam skrytých akcí. DropdownMenu se automaticky pozicionuje vzhledem k ikoně.

kotlin
@Composable
fun TopBarWithOverflow() {
    var menuExpanded by remember { mutableStateOf(false) }
    TopAppBar(
        title = { Text("Profil") },
        actions = {
            IconButton(onClick = { /* share */ }) {
                Icon(Icons.Filled.Share, contentDescription = "Share")
            }
            Box {
                IconButton(onClick = { menuExpanded = true }) {
                    Icon(Icons.Filled.MoreVert, contentDescription = "More")
                }
                DropdownMenu(
                    expanded = menuExpanded,
                    onDismissRequest = { menuExpanded = false }
                ) {
                    DropdownMenuItem(text = { Text("Nastavení") }, onClick = { /* navigate */ })
                    DropdownMenuItem(text = { Text("O aplikaci") }, onClick = { /* navigate */ })
                }
            }
        }
    )
}

Je důležité nastavit contentDescription pro každou ikonu — to je požadavek přístupnosti. Bez popisu TalkBack tlačítko neohlásí. U čistě dekorativních prvků použijte contentDescription = null.

TopAppBar v Material3: Dynamic Color a adaptace

Material3 (M3) je aktuální verze Material Designu doporučená Googlem pro nové projekty. TopAppBar v M3 je implementován přes TopAppBar, CenterAlignedTopAppBar a MediumTopAppBar. Klíčový rozdíl oproti Material2 — vestavěná podpora dynamic color, adaptivní výšky a scroll behavior.

Dynamic Color automaticky vybírá barvy panelu na základě tapety zařízení (Android 12+). TopAppBar v M3 používá surfaceColor pro pozadí a primary pro titulek. Pokud dynamic color není k dispozici, použije se záložní paleta z MaterialTheme. Podle Google Material Design (2025) používá dynamic color v aplikacích 63 % uživatelů Android 12+.

MediumTopAppBar je rozšířená varianta s velkým titulkem (32 sp), který se při posouvání postupně zmenšuje na 20 sp a přeměňuje se na SmallTopAppBar. Tohoto efektu je dosaženo pomocí TopAppBarDefaults.mediumTopAppBarColors() a parametru scrollBehavior. Animace přechodu je řízena TopAppBarState, který sleduje sbalování titulku.

kotlin
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MediumTopBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
    Scaffold(
        topBar = {
            MediumTopAppBar(
                title = { Text("Knihovna") },
                navigationIcon = {
                    IconButton(onClick = { }) {
                        Icon(Icons.Filled.Menu, contentDescription = "Menu")
                    }
                },
                scrollBehavior = scrollBehavior
            )
        }
    ) { padding ->
        LazyColumn(contentPadding = padding) { /* content */ }
    }
}

Pro Material3 TopAppBar je nutné použít @OptIn(ExperimentalMaterial3Api::class) — anotace označuje, že se API může v budoucích verzích změnit. K roku 2025 zůstává TopAppBar v M3 experimental, ale Google jej doporučuje pro produkci s odpovídajícím ověřením.

ScrollBehavior: skrytí panelu při posouvání

ScrollBehavior je mechanismus, který řídí viditelnost TopAppBar při vertikálním posouvání obsahu. V Jetpack Compose scrollBehavior umožňuje skrýt nebo zmenšit panel pro uvolnění místa, což je užitečné zejména na obrazovkách s velkým seznamem obsahu.

Material3 nabízí tři strategie: enterAlways (panel se objeví při posouvání nahoru a schová se při posouvání dolů), exitUntilCollapsed (panel se schová až po úplném sbalení titulku) a vlastní pomocí implementace rozhraní TopAppBarScrollBehavior. První varianta je vhodná pro obsahové feedy, druhá — pro obrazovky s MediumTopAppBar.

ScrollBehavior vyžaduje koordinaci s LazyColumn nebo LazyRow přes rememberLazyListState(). Stav posouvání je předáván TopAppBar přes parametr scrollBehavior. Komponenta se automaticky přihlásí k událostem posouvání a animuje viditelnost panelu. Podle Android Developers (2025) je enterAlwaysScrollBehavior nejoblíbenější strategií, používanou v 75 % aplikací s posouvatelným TopAppBar.

Nastavení vlastního ScrollBehavior

Pro vytvoření vlastního chování zděďte z TopAppBarScrollBehavior a přepište metody onScroll a onDrag. Vlastní chování je užitečné, když standardní scénáře nepokrývají požadavky návrhu — například panel by se měl skrýt až po překročení určitého prahu posouvání.

Ve výchozím nastavení scrollBehavior nepřidává okraje pro obsah — paddingTop je třeba nastavit ručně pomocí contentPadding v Scaffold nebo pomocí Modifier.padding v LazyColumn. V MediumTopAppBar se okraje automaticky vypočítávají přes TopAppBarState.collapsedFraction.

kotlin
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Scaffold(
    topBar = {
        MediumTopAppBar(
            title = { Text("Obsah") },
            scrollBehavior = scrollBehavior
        )
    }
) { padding ->
    LazyColumn(contentPadding = padding) { /* items */ }
}

ScrollBehavior je k dispozici pouze v Material3. V Material2 TopAppBar nemá vestavěnou podporu pro skrytí při posouvání — pro podobné chování je vyžadována ruční implementace přes NestedScrollConnection.

Často kladené otázky

Jaký je rozdíl mezi TopAppBar a Toolbar v Androidu?

TopAppBar je implementace App Bar v Compose, která pracuje deklarativně přes composable funkce. Toolbar je View komponenta z XML rozvržení. TopAppBar se automaticky přizpůsobuje tématu Compose, podporuje slot API a nevyžaduje findViewById, na rozdíl od Toolbar, který je spravován pomocí kódu Activity.

Jak odstranit stín z TopAppBar?

V Material3 stín ve výchozím nastavení chybí — TopAppBar používá barvu povrchu (surface) místo elevation. V Material2 se stín odstraní nastavením parametru elevation = 0.dp. Dodatečně lze zavolat Modifier.shadow(0.dp) pro úplné vypnutí.

Jak přidat vyhledávací pole do TopAppBar?

Předejte composable blok s TextField v parametru title. Při aktivaci vyhledávání skryjte navigationIcon a actions pomocí podmíněného vykreslování. Stav ukládejte přes remember: var isSearching by remember { mutableStateOf(false) }. Když isSearching = true, v title se vykreslí TextField místo Text.

Podporuje TopAppBar dvouřádkový titulek?

Ano, pomocí vlastního composable v parametru title. Místo jednoho Text předejte Column se dvěma Text: první — hlavní titulek (semibold), druhý — podtitulek (medium, menší velikost). MediumTopAppBar má vestavěnou podporu pro dvouřádkový titulek s animací sbalování.

Proč se TopAppBar překrývá se stavovým řádkem?

TopAppBar automaticky nezohledňuje systémové okraje. Je třeba aplikovat Modifier.statusBarsPadding() na TopAppBar nebo použít Scaffold, který zpracovává WindowInsets. V Material3 byl přidán parametr windowInsets pro automatické zohlednění systémových polí.

Shrnutí

  • TopAppBar — hlavní komponenta horního panelu v Jetpack Compose, implementovaná přes slot API s title, navigationIcon a actions
  • Material3 nabízí tři varianty: SmallTopAppBar, CenterAlignedTopAppBar a MediumTopAppBar s podporou dynamic color
  • NavigationIcon se používá pro otevření Drawer nebo návrat a akce (actions) pro kontextové ikony
  • ScrollBehavior řídí viditelnost TopAppBar při posouvání pomocí strategií enterAlways a exitUntilCollapsed
  • DropdownMenu umožňuje umístit přetékající akce do rozbalovacího menu s ikonou MoreVert
  • Dynamic Color automaticky přizpůsobuje barvy TopAppBar tapetě zařízení na Android 12+
  • Pro zabránění překryvu se stavovým řádkem použijte Modifier.statusBarsPadding() nebo parametr windowInsets v M3

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í.

Prodiskutovat projekt

Přečtěte si také