IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - Základné pozíciovanie a náhľady GUI v Compose

V minulej lekcii, Úvod do Jetpack Compose , sme si predstavili framework Jetpack Compose a tiež sme spolu vytvorili prvú Hello World aplikáciu. Vysvetlili sme si základný koncept Compose a jeho výhody oproti návrhu v XML.

V dnešnom Compose tutoriále si ukážeme základné prvky pozíciovania. Bez nich sa pri tvorbe moderných Android aplikácií v Kotline nezaobídeme. Predstavíme si komponent Row() pre horizontálne pozíciovanie a komponent Column() pre vertikálne pozíciovanie. Vytvoríme si praktické príklady, v ktorých sa obe komponenty naučíme používať. Povieme si tiež o anotácii @Preview, ktorá umožňuje vytvoriť náhľad nášho rozhrania. Ide o veľmi praktickú vec, aplikáciu totiž vďaka nej nebudeme musieť na kontrolu zobrazenia zakaždým znovu spúšťať.

Základné prvky pozíciovania

Aby sme mohli pozíciovať komponenty našej aplikácie, budeme používať tzv. layouty. Predstavíme si základné komponenty Row() a Column(), teda riadok a stĺpec. Obe sú v knižnici Compose už preddefinované. Row() nám umožňuje rozložiť komponenty horizontálne. Naopak Column() nám slúži na vertikálne pozíciovanie.

Väčšinou si vystačíme s layoutmi, ktoré už máme v Compose k dispozícii. V prípade potreby Compose umožňuje aj tvorbu ďalších vlastných layoutov.

V klasickom návrhu užívateľského rozhrania s pomocou XML súborov by sme použili LinearLayout, prípadne ConstraintLayout, ktorý nájdeme aj v Compose. ConstraintLayout si predstavíme a vyskúšame v niektorom z ďalších dielov nášho kurzu. Dnes sa zameriame na komponenty Row() a Column().

Vytvorenie ComposeLayout aplikácie

Poďme sa pustiť do práce. Otvoríme si Android Studio a vytvoríme nový projekt. Urobíme to úplne rovnako, ako pri tvorbe HelloWorld aplikácie. Meno projektu tentoraz zmeníme na ComposeLayout:

založenie projektu - Tvorba UI v Jetpack Compose

Chvíľku počkáme, kým Android Studio načíta nový projekt.

Pokiaľ sa nám neotvoril automaticky súbor MainActivity.kt, nájdeme ho v ľavej časti IDE, dvakrát naň klikneme a tým si ho otvoríme:

súbor MainActivity.kt - Tvorba UI v Jetpack Compose

Teraz môžeme začať pozicovať komponenty nášho používateľského rozhrania.

Metóda ColumnTest()

Pre začiatok si ukážeme, ako funguje komponent Column(). Vytvoríme si novú @Composable metódu, v ktorej budeme pozíciovať položky nášho užívateľského rozhrania. Pomenujeme ju ColumnTest():

@Composable
fun ColumnTest() {

}

Pripomeňme si, že meno @Composable metód začína veľkým písmenom. Mohli by sme samozrejme metódu pomenovať aj s malým písmenom na začiatku. V rámci dobrých praktík však odporúčame začínať veľkým písmenom, aby sme mohli rozlíšiť @Composable metódy od ostatných.

Do metódy ColumnTest() teraz pridáme dva komponenty Text(), ktoré chceme umiestniť pod seba:

@Composable
fun ColumnTest() {
    Text(text = "Hello")
    Text(text = "Android")
}

Metóda onCreate()

Presunieme sa do metódy onCreate() av bloku setContent zavoláme našu novú metódu. Tým zaistíme, aby sa nám zobrazili položky, ktoré máme definované v metóde ColumnTest():

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        ColumnTest()
    }
}

Teraz aplikáciu spustíme. Hneď vidíme, že výsledok nie je taký, ako by sme chceli. Naše texty nie sú pod sebou, ale prekrývajú sa v ľavom hornom rohu:

náhľad metódy ColumnTest - Tvorba UI v Jetpack Compose

Pridanie komponentu Column()

Aby sme túto chybu opravili, budeme musieť do metódy ColumnTest() doplniť komponent Column(). Je to veľmi jednoduché, iba ju zavoláme a vložíme do nej komponenty, ktoré chceme umiestniť pod seba. Ich poradie bude zachované tak, ako ho máme v kóde:

@Composable
fun ColumnTest() {
    Column() {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Komponent Column() pridáme ešte Modifier a nastavíme v ňom farbu pozadia. Zmena sa prejaví pri všetkých komponentoch v Column() zahrnutých:

@Composable
fun ColumnTest() {
    Column(modifier = Modifier.background(Color.Cyan)) {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Modifier je ďalší mocný nástroj v Compose, preto sa mu bližšie budeme venovať v niektorej z ďalších lekcií.

Keď potom našu aplikáciu znovu spustíme, uvidíme dva texty pod sebou so zvýrazneným pozadím. To je presne to, čo potrebujeme:

náhľad upravenej metódy ColumnTest - Tvorba UI v Jetpack Compose

Možnosti komponentu Column()

Predstavme si, že by sme teraz chceli zarovnať naše textové komponenty na stred. Komponent Column() nám ponúka jednoduchú možnosť, ako to zariadiť. Pomocou parametra horizontalAlignment nastavíme zarovnanie na stred. Tiež ďalej upravíme Modifier a roztiahneme pozadie oboch textov na celú šírku obrazovky. Upravený kód bude vyzerať nasledovne:

@Composable
fun ColumnTest() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth().background(Color.Cyan)
    ) {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Príkaz Alignment.CenterHorizontally nám zaistí, aby boli elementy zarovnané na stred. Roztiahnutie komponentov na celú šírku obrazovky docielime použitím metódy fillMaxWidth().

Potom, čo aplikáciu opäť spustíme uvidíme nasledujúci výsledok:

náhľad metódy ColumnTest s Modifier - Tvorba UI v Jetpack Compose

Vidíme, že Column() zarovnal naše komponenty Text() na stred a veľkosť komponentu sa roztiahla na celú šírku obrazovky.

Náhľady rozhrania

Zatiaľ sme zakaždým museli aplikáciu spustiť, aby sme zistili, ako vyzerá jej aktuálny vzhľad. To je vcelku zdĺhavé a môže to byť veľký problém. Pri tvorbe zložitejšieho GUI by sme takouto kontrolou stratili dosť času. Aby sme eliminovali tento problém, prichádza do hry anotácia @Preview.

Anotáciu @Preview môžeme pridať ktorejkoľvek @Composable metóde, ktorá spĺňa dve základné požiadavky:

  • neprijíma žiadne argumenty a
  • nevracia žiadnu hodnotu.
Názorne si to ukážeme na metóde ColumnTest(), ktorá oba požiadavky spĺňa. Metódu teda anotujeme pomocou @Preview:
@Preview
@Composable
fun ColumnTest() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.background(Color.Cyan).fillMaxWidth(),
    ) {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Teraz prepneme náš editor do režimu Split kliknutím na rovnomenné tlačidlo v pravej hornej oblasti Android Štúdia:

prepnutie na Split režim - Tvorba UI v Jetpack Compose

Následne musíme zostaviť náš projekt, ak sme to ešte neurobili:

Tvorba UI v Jetpack Compose

Potom už uvidíme náš náhľad grafického rozhrania:

náhľad metódy ColumnTest pomocou @Preview - Tvorba UI v Jetpack Compose

Takto môžeme veľmi jednoducho kontrolovať jednotlivé layouty a rýchlo zistiť, či vyzerajú, ako sme chceli.

Súčasť Row()

Druhý z komponentov, ktorý si dnes predstavíme, je veľmi podobný komponentu Column(). Komponent Row() však použijeme, ak chceme pozíciovať elementy horizontálne.

Poďme si do projektu pridať novú metódu RowTest():

@Preview
@Composable
fun RowTest() {
    Row(modifier = Modifier.fillMaxWidth().background(Color.Cyan)) {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Do metódy sme vložili dve textové komponenty. Roztiahli sme jej veľkosť na celú šírku obrazovky a taktiež sme zmenili farbu pozadia. V jej náhľade, uvidíme nasledujúce rozhranie:

náhľad metódy RowTest - Tvorba UI v Jetpack Compose

Pokiaľ sa nám grafické rozhranie nezobrazuje, zostavíme najskôr projekt kliknutím na Build v hornej lište IDE.

Nakoniec si dnes ešte ukážeme, ako zarovnať elementy v Row() komponente na stred. Urobíme to obdobne, ako pri vertikálnom centrovaní. Komponent tentoraz nastavíme parameter verticalAlignment:

@Preview
@Composable
fun RowTest() {
    Row(
        modifier = Modifier.fillMaxWidth().height(150.dp).background(Color.Cyan),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(text = "Hello")
        Text(text = "Android")
    }
}

Doplnili sme aj Modifier a nastavili výšku komponentov na 150 dp.

Jednotka dp nám určuje veľkosť, ktorá nie je závislá na hustote pixelov. Veľkosť komponentov bude takto rovnaká na všetkých zariadeniach.

V náhľade teraz uvidíme, ako sú jednotlivé elementy zarovnané na stred:

náhľad upravenej metódy RowTest - Tvorba UI v Jetpack Compose

To je pre dnešok všetko. Vzorovú aplikáciu si môžete ďalej upraviť a zmeniť napríklad farbu pozadia, experimentovať s centrovaním, pridať ďalší text a podobne.

V budúcej lekcii, Jednoduchá kalkulačka v Compose - Tvorba komponentov , začneme tvoriť kalkulačku. Pripravíme si tlačidlá pre jednotlivé početné operácie, ktoré budeme používať v našom grafickom rozhraní a ukážeme si, ako správne štruktúrovať náš projekt.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 4x (34.73 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

 

Predchádzajúci článok
Úvod do Jetpack Compose
Všetky články v sekcii
Tvorba UI v Jetpack Compose
Preskočiť článok
(neodporúčame)
Jednoduchá kalkulačka v Compose - Tvorba komponentov
Článok pre vás napísal Marek Urbańczyk
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje programování v Kotlinu, Javě. Má také zkušenosti s C#.
Aktivity