Lekce 10 - Android programování - ConstraintLayout - Vytvoření omezení
V minulé lekci, Android Programování - Neobjevujte kolo, použijte Gradle, jsme si ukázali práci s balíčkovacím nástrojem Gradle a naprogramovali jednoduchý graf.
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í nás na problém upozorní a chybějící omezení vypíše 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, v nabídce
Layout 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.
Krátce si opět popíšeme všechny tři možnosti:
- Úpravou kódu v XML,
- v Preview myší,
- v atributech vybrané komponenty.
1. Odstranění omezení v XML
Přímo v XML kódu omezení odstraníme jednoduše tím, že smažeme příslušné atributy. Stačí tedy odstranit (nebo zakomentovat) řádky kódu, který jsme předtím přidali.
2. 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. Můžeme také najet myší na příslušné omezení při stisknuté klávese Ctrl (což způsobí zčervenání tohoto omezení), následným kliknutím na toto omezení jej odstraníme:
3. 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í.