9. diel - Android programovanie - ConstraintLayout - Vytvorenie obmedzení
V dnešnej lekcii sa zoznámime s kontajnerom ConstraintLayout
,
ktorý je v Android Studiu používaný ako východiskový
layout na rozloženie komponentov na aktivite.
ConstraintLayout
disponuje slušnou kôpkou funkcií, ktoré z neho
robia mocného pomocníka pri návrhu našich aktivít. My si
popíšeme hlavne tie základné.
Aby nechýbala praktická ukážka, ukážeme si všetko na vzhľade projektu
SimpleCalc
, kde sme vytvárali veľmi jednoduchú kalkulačku.
Vzhľad kalkulačky vyzeral takto:
ConstraintLayout
ConstraintLayout
umožňuje vytvárať zložité rozvrhnutia
grafického používateľského rozhrania. Tento layout je veľmi podobný
RelativeLayout
v tom, že všetky komponenty sú rozložené podľa
vzťahov medzi sebou a/alebo nadradeným objektom, často tak, že ich k sebe
prichytíme. Tieto vzťahy definujeme pomocou tzv. obmedzení
(constraints), viď ďalej.
Vytvorme teraz znova požadovaný vzhľad kalkulačky zo základných
komponentov. Ide skutočne o veľmi jednoduchý dizajn bez žiadnych
zložitých prvkov. Ukážeme si pri tom ďalšie možnosti pozíciovania
komponentov našej kalkulačky v kontajneri ConstraintLayout
.
V Android Studiu otvoríme súbor activity_main.xml
a okno s
náhľadom prepneme na zobrazenie Blueprint, ktoré je pre túto prácu
najvhodnejšie:
Režim náhľadu Blueprint je na zostavovanie layoutu vhodnejší preto, že sú v ňom dobre znázornené všetky vytvorené väzby a závislosti medzi jednotlivými objektmi.
Pridanie komponentu do layoutu
Teraz postupne pretiahneme z okna Palette do okna rozvrhnutia nasledujúce komponenty:
EditText
(políčko na zadávanie textu),Spinner
(rozbaľovacie menu),TextView
(text) aButton
(tlačidlo).
Pokiaľ ale aplikáciu takto, bez nutných obmedzení spustíme, bude výsledkom, že sa všetky vložené komponenty vykreslia v ľavom hornom rohu!
Hoci chýbajúce obmedzenia nespôsobia chybu kompilácie, editor rozloženia nás na problém upozorní a chýbajúce obmedzenia vypíše ako chybu na paneli nástrojov:
Tu sme upozornení na chýbajúce horizontálne aj vertikálne obmedzenia všetkých vložených komponentov. Poďme sa teda na obmedzenie pozrieť.
Obmedzenia
Obmedzením rozumejme najmä prichytenie komponentu k nejakej inej z nejakej jej strany. Ďalšie možnosti si vysvetlíme ďalej. Každé obmedzenie predstavuje spojenie alebo zarovnanie s iným komponentom, nadradeným layoutom alebo neviditeľným vodítkom.
Obmedzeniami (constraints) definujeme pozíciu komponentu. Každý vložený komponent musí mať aspoň jedno horizontálne a jedno vertikálne obmedzenie, ktorými definujeme polohu komponentu v danej osi. Jednoducho komponent k niečomu pripneme.
Vytvorenie obmedzení (constraints)
Obmedzenie môžeme nastaviť tromi spôsobmi:
- Pridaním potrebného kódu v XML,
- v Preview myšou,
- v atribútoch vybrané komponenty.
1. Nastavenie obmedzenia v XML
Tento spôsob je najmenej pohodlný. Nasledujúci kód pridá políčku
horizontálne obmedzenie tak, že ho prichytí k pravej aj ľavej strane
nadradeného objektu (ktorým je ConstraintLayout
). Tým, že
layout s tlačidlami obmedzíme na ľavú aj pravú stranu
layoutu, ho horizontálne vycentrujeme. Vertikálne obmedzenie
je potom vytvorené iba prichytením k hornej hrane layoutu:
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"
2. Nastavenie obmedzenia v Preview myšou
To isté, čo sme nastavili vyššie, si skúsime nastaviť niekoľkými ťahmi myši v Preview. Ako je naznačené žltou farbou na nasledujúcom obrázku, postupne uchopíme každý príslušný kruhový úchyt na obmedzenie a pretiahneme myšou k okraju layoutu (alebo iné komponenty):
Výsledok bude vyzerať takto:
Možno ste si všimli, že práve editovaný EditText
nie je
úplne „prilepený“ k okrajom layoutu, ale je tu kúsok medzera. Je to
preto, že nadradený layout má nastavený atribút padding
.
3. Nastavenie obmedzenia v atribútoch komponentu
Tretím spôsobom nastavenia obmedzenia prvého políčka kalkulačky je
označenie príslušného komponentu (v okne Preview alebo v okne
Component Tree). Potom v okne Attributes, v ponuke
Layout klikneme na tlačidlo +
tej strany komponenty,
ktoré chceme obmedzenie nastaviť:
Po kliknutí na +
je automaticky vytvorené obmedzenie a je
nastavený margin (medzera), ktorého veľkosť zodpovedá aktuálnej pozícii
komponentu, v ktorej sa nachádzala pred pridaním obmedzenia. Tento margin
môžeme samozrejme zmeniť.
V prípade prvého políčka kalkulačky klikneme na ľavé a pravé
+
a oba postranné marginy nastavíme na 0
. Tým je
políčko horizontálne vycentrované. Aby bolo políčko roztiahnuté na celú
šírku displeja, musíme navyše nastaviť v okne Attributes jeho
atribút layout_width
na hodnotu
0dp (match constraint)
. Vertikálne obmedzenie políčka vytvoríme
kliknutím na hornú +
. Opäť strážime, aby margin bol na
hodnote 0
, pretože chceme mať prvé políčko "prilepené" úplne
hore.
Na nasledujúcom obrázku je spomínané nastavenie parametra
layout_width
naznačené:
Odstránenie obmedzení
Pojmeme tému komplexne, aby sme s ConstraintLayout
vedeli sami
pracovať. Nové obmedzenia si teraz môžeme skúsiť zas odstrániť.
Krátko si opäť popíšeme všetky tri možnosti:
- Úpravou kódu v XML,
- v Preview myšou,
- v atribútoch vybrané komponenty.
Priamo v XML kóde obmedzení odstránime jednoducho tým, že zmažeme príslušné atribúty. Stačí teda odstrániť (alebo zakomentovať) riadky kódu, ktorý sme predtým pridali.
2. Odstránenie obmedzení v Preview
Tu obmedzenie odstránime označením príslušného obmedzenia a stlačením tlačidla Del na klávesnici. Môžeme tiež nabehnúť myšou na príslušné obmedzenie pri stlačenom klávese Ctrl (čo spôsobí sčervenanie tohto obmedzenia), následným kliknutím na toto obmedzenie ho odstránime:
3. Odstránenie obmedzení v atribútoch komponentu
Myšou nabehneme na miesto podľa nasledujúceho obrázku a po zobrazení krížika klikneme:
Možno ste si všimli, že niekedy je v Preview obmedzení znázornené čiarou a niekedy "pružinkou", spájajúcou dané objekty. Pružinka znázorňuje "protichodné sily", kedy je komponent napr. "priťahovaný" k dvom protiľahlým stenám a tým je centrovaný.
V budúcej lekcii, Android programovanie - ConstraintLayout - Druhy obmedzení , si ukážeme druhy obmedzení
ConstraintLayout
vrátane praktických ukážok použitia.