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