Lekce 9 - Android programování - ConstraintLayout - Vytvoření omezení
V minulé lekci, Android programování - Životní cyklus aktivity, jsme se dozvěděli co je to API, jak vytvořit projekt a základní informace o životním cyklu aktivity.
V dnešní lekci se seznámíme s kontejnerem ConstraintLayout,
který je v Android Studiu používán jako výchozí layout k rozložení
komponent na aktivitě. ConstraintLayout disponuje slušnou
hromádkou funkcí, které z něj dělají mocného pomocníka při návrhu
našich aktivit. My si popíšeme hlavně ty základní. Aby nechyběla
praktická ukázka, ukážeme si vše na vzhledu projektu
SimpleCalc, kde jsme vytvářeli velice jednoduchou kalkulačku.
Vzhled kalkulačky vypadal takto:

ConstraintLayout
ConstraintLayout umožňuje vytvářet složitá rozvržení
grafického uživatelského rozhraní. Tento layout je hodně podobný
RelativeLayout v tom, že všechny komponenty jsou rozloženy podle
vztahů mezi sebou a/nebo nadřazeným objektem, často tak, že je k sobě
přichytíme. Tyto vztahy definujeme pomocí tzv. omezení
(constraints), viz dále.
Vytvořme nyní znovu požadovaný vzhled kalkulačky ze základních
komponent. Jde skutečně o velice jednoduchý design bez žádných složitých
prvků. Ukážeme si při tom další možnosti pozicování komponent naší
kalkulačky v kontejneru ConstraintLayout.
V Android Studiu otevřeme soubor activity_main.xml a okno s
náhledem přepneme na zobrazení Blueprint, které je pro tuto práci
nejvhodnější:

Režim náhledu Blueprint je k sestavování layoutu vhodnější proto, že jsou v něm dobře znázorněny všechny vytvořené vazby a závislosti mezi jednotlivými objekty.
Přidání komponenty do layoutu
Nyní postupně přetáhneme z okna Palette do okna rozvržení následující komponenty:
EditText(políčko pro zadávání textu),Spinner(rozbalovací menu),TextView(text) aButton(tlačítko).
Komponenty zůstanou tam, kde je necháme, i když nemají definována žádná omezení. Je tomu tak pouze proto, aby byla práce v editoru snadnější.
Pokud ale aplikaci takto, bez nutných omezení spustíme, bude výsledkem, že se všechny vložené komponenty vykreslí v levém horním rohu!
Ačkoli chybějící omezení nezpůsobí chybu kompilace, editor rozložení označuje chybějící omezení jako chybu na panelu nástrojů:

Zde jsme upozorněni na chybějící horizontální i vertikální omezení všech vložených komponent. Pojďme se tedy na omezení podívat.
Omezení
Omezením rozumějme zejména přichycení komponenty k nějaké jiné z nějaké její strany. Další možnosti si vysvětlíme dále. Každé omezení představuje spojení nebo zarovnání s jinou komponentou, nadřazeným layoutem nebo neviditelným vodítkem.
Omezeními (constraints) definujeme pozici komponenty. Každá vložená komponenta musí mít alespoň jedno horizontální a jedno vertikální omezení, kterými definujeme polohu komponenty v dané ose. Jednoduše komponentu k něčemu připneme.
Vytvoření omezení (constraints)
Omezení můžeme nastavit třemi způsoby:
- Přidáním potřebného kódu v XML
- V Preview myší
- V Atributech vybrané komponenty
Všechny tři způsoby si ukážeme na nastavení omezení prvního zadávacího políčka naší kalkulačky.
1. Nastavení omezení v XML
Tento způsob je nejméně pohodlný. Následující kód přidá políčku
horizontální omezení tak, že jej přichytí k pravé i levé straně
nadřazeného objektu (kterým je ConstraintLayout). Tím, že
layout s tlačítky omezíme na levou i pravou stranu layoutu,
jej horizontálně vycentrujeme. Vertikální omezení je pak
vytvořeno pouze přichycením k horní hraně layoutu:
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"
2. Nastavení omezení v Preview myší
To samé, co jsme nastavili výše, si zkusíme nastavit několika tahy myši v Preview. Jak je naznačeno žlutou barvou na následujícím obrázku, postupně uchopíme každý příslušný kruhový úchyt pro omezení a přetáhneme myší k okraji layoutu (nebo jiné komponenty):

Výsledek bude vypadat takto:

Možná jste si všimli, že právě editovaný EditText není
úplně "přilepen" k okrajům layoutu, ale je zde kousek mezera. Je to proto,
že nadřazený layout má nastaven atribut padding.
3. Nastavení omezení v Atributech komponenty
Třetím způsobem nastavení omezení prvního políčka kalkulačky je
označení příslušné komponenty (v okně Preview nebo v okně
Component Tree). Pak v okně Attributes klikneme na tlačítko
+ té strany komponenty, které chceme omezení nastavit:

Po kliknutí na + je automaticky vytvořeno omezení a je
nastaven margin (mezera), jehož velikost odpovídá aktuální pozici
komponenty, ve které se nacházela před přidáním omezení. Tento margin
můžeme samozřejmě změnit.
V případě prvního políčka kalkulačky klikneme na levé a pravé
+ a oba postranní marginy nastavíme na 0. Tím je
políčko horizontálně vycentrováno. Aby bylo políčko roztažené na celou
šířku displeje, musíme navíc nastavit v okně Attributes jeho
atribut layout_width na hodnotu
0dp (match constraint). Vertikální omezení políčka vytvoříme
kliknutím na horní +. Opět ohlídáme, aby margin byl na
hodnotě 0, protože chceme mít první políčko "přilepené"
úplně nahoře.
Na následujícím obrázku je zmíněné nastavení parametru
layout_width naznačeno:

Odstranění omezení
Pojměme téma komplexně, abychom s ConstraintLayout uměli
sami pracovat. Nová omezení si teď můžeme zkusit zas odstranit. Kromě
toho, že samozřejmě můžeme přímo v XML kódu odstranit příslušné
atributy, máme tyto další možnosti odstranění omezení:
- V Preview
- V Atributech vybrané komponenty
1. Odstranění omezení v Preview
Zde omezení odstraníme označením příslušného omezení a stisknutím tlačítka Del na klávesnici nebo najetím myši na příslušné omezení při stisknuté klávese Ctrl (což způsobí zčervenání tohoto omezení) a kliknutím na toto omezení:

2. Odstranění omezení v Atributech komponenty
Myší najedeme na místo dle následujícího obrázku a po zobrazení křížku klikneme:

Možná jste si všimli, že někdy je v Preview omezení znázorněno čárou a někdy "pružinkou", spojující dané objekty. Pružinka znázorňuje "protichůdné síly", kdy je komponenta např. "přitahována" ke dvěma protilehlým stěnám a tím je centrována.
V příští lekci, Android programování - ConstraintLayout - Druhy omezení, si ukážeme druhy omezení ConstraintLayout včetně praktických ukázek použití.


