Přehled layoutů - zizanek/-github-tz-pma-2026-priprava GitHub Wiki
Rozvržení uživatelského rozhraní v Androidu: Přehled layoutů
V systému Android je každá obrazovka tvořena hierarchií vizuálních prvků. Jednotlivé komponenty (tlačítka, texty, obrázky – souhrnně označované jako View) jsou vkládány do neviditelných kontejnerů zvaných ViewGroup neboli Layouty.
Layout určuje polohu, velikost a vzájemné uspořádání vložených prvků na různých typech a velikostech displejů.
1. Základní principy práce s layouty
Všechny prvky vložené do layoutu musí mít definovány dva základní atributy určující jejich rozměry:
android:layout_width(šířka prvku),android:layout_height(výška prvku).
Pro tyto atributy se používají následující hodnoty:
wrap_content: Prvek se roztáhne pouze tak, aby se do něj vešel jeho vnitřní obsah (např. text v tlačítku).match_parent: Prvek se roztáhne na celou dostupnou šířku nebo výšku svého rodičovského kontejneru.- Pevná hodnota v jednotkách
dp(např.100dp): Používá se převážně u obrázků či specifických oddělovačů, nikoli u textů (hrozí oříznutí při změně velikosti písma v systému).
2. Přehled hlavních typů layoutů
A. LinearLayout (Lineární řazení)
LinearLayout skládá všechny své vnořené prvky do jedné řady – buď svisle pod sebe, nebo vodorovně vedle sebe.
- Klíčový atribut:
android:orientation="vertical"(svislé řazení) neboandroid:orientation="horizontal"(vodorovné řazení). - Váhové rozložení (
layout_weight):
Umožňuje rozdělit zbývající volné místo v kontejneru v přesném poměru mezi prvky (např. dvě tlačítka vedle sebe, každé zabírá přesně 50 % šířky).
Ukázka svislého řazení:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="První prvek nahoře" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Druhý prvek pod ním" />
</LinearLayout>
- Využití: Jednoduché formuláře, řady tlačítek, svislé seznamy ovládacích prvků.
B. ConstraintLayout (Moderní standard pro komplexní obrazovky)
ConstraintLayout je v současnosti výchozím a doporučeným kontejnerem v Android Studiu. Pozice každého prvku je určena pomocí vazeb (constraints) k okrajům obrazovky nebo k ostatním prvkům.
- Základní pravidlo: Každý vložený prvek musí mít definovanou alespoň jednu vodorovnou a jednu svislou vazbu, jinak je při překladu umístěn do levého horního rohu
[0,0]. - Plochá hierarchie (Flat view hierarchy): Umožňuje vytvářet složitá rozhraní bez nutnosti vnořovat do sebe desítky dílčích layoutů, což výrazně zrychluje vykreslování obrazovky.
Příklad vazby mezi prvky:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nadpis obrazovky"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/btnAction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Akční tlačítko"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- Využití: Většina běžných obrazovek moderních aplikací s komplexním rozložením.
C. FrameLayout (Překrývání vrstev)
FrameLayout je navržen tak, aby držel zpravidla pouze jeden prvek, případně skládal prvky přes sebe v pořadí, v jakém jsou zapsány v XML kódu (vrstva nad vrstvou – jako ve Photoshopu).
Příklad: Obrázek s ikonou zámku uprostřed:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/img_bike_oiz_m10"
android:scaleType="centerCrop" />
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:src="@drawable/ic_lock" />
</FrameLayout>
- Využití: Dynamické kontejnery pro fragmenty (
FragmentContainerView), odznaky notifikací (badge) přes ikony, načítací kolečka překrývající obsah.
D. ScrollView (Posouvání přetékajícího obsahu)
Pokud výška obsahu obrazovky přesáhne výšku fyzického displeje (např. na menších telefonech), obsah se ve standardním LinearLayoutu ořízne a nelze jej posunout. Pro zajištění posouvání slouží ScrollView.
- Zásadní pravidlo:
ScrollViewsmí obsahovat pouze jeden přímý potomkovský element (zpravidla svislýLinearLayout), do kterého se vkládají ostatní prvky.
Ukázka struktury:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- Zde jsou vloženy libovolné prvky formuláře -->
</LinearLayout>
</ScrollView>
E. RelativeLayout (Zastaralý předchůdce)
Starší typ rozvržení, kde se prvky zarovnávaly relativně k rodiči nebo k sobě navzájem pomocí atributů jako android:layout_below="@id/...".
Doporučení pro praxi:
V moderním Androidu jeRelativeLayoutpovažován za zastaralý a byl plně nahrazen výkonnějším a flexibilnějšímConstraintLayoutem.
3. Srovnávací přehled použití
| Název layoutu | Směr / Princip řazení | Kdy jej zvolit |
|---|---|---|
LinearLayout |
Jeden směr (horizontálně / vertikálně) | Jednoduché sekvence prvků, přepínače v řadě, formuláře pod sebou. |
ConstraintLayout |
Síť relativních vazeb (nahoře, dole, vlevo, vpravo) | Výchozí volba pro kompletní obrazovky; eliminuje vnořené layouty. |
FrameLayout |
Vrstvení prvků na sebe na ose Z | Plovoucí tlačítka, překryvné stavy (loading), držáky pro fragmenty. |
ScrollView |
Rolování obsahu na ose Y | Dlouhé formuláře a obrazovky, které se nevejdou na displej. |