Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

6. diel - Android programovanie - Implementácia Kotlín kódu kalkulačky

V dnešnej lekcii Android tutoriálu si konečne ukážeme Kotlin kód budúcej kalkulačky a dostaneme sa teda na programovanie!

Kotlín kód aplikácie

Kód budeme písať do súboru MainActivity.kt, ktorý bol vygenerovaný Android Štúdiom pri vytváraní projektu kalkulačky. Pri prvom pohľade do MainActivity.kt uvidíme tento kód, obsahujúci jedinú metódu:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Zatiaľ jediné dva riadky v onCreate() volajú metódu predka a nastavujú vzhľad grafického používateľského rozhrania odkazom na XML súbor návrhu activity_main.xml.

Teraz si ukážeme niekoľko ďalších častí kódu, ktoré budeme do MainActivity.kt postupne pridávať.

Deklarácia premenných

V súbore MainActivity.kt, nad metódou onCreate(), najskôr deklarujeme premenné pre uloženie referencií na tie komponenty z XML návrhu, s ktorými budeme pracovať:

private lateinit var etNumber1: EditText
private lateinit var etNumber2: EditText
private lateinit var spinnerOperation: Spinner
private lateinit var labelResult: TextView

Keby sme nepoužili kľúčové slovo lateinit, museli by sme atribút nastaviť na null. Kľúčové slovo lateinit nám umožňuje k atribútu nepriraďovať hodnotu. Pri volaní metódy na neinicializovaný atribút nám spôsobí výnimku UninitializedPropertyAccessException. Toto si neskôr ukážeme.

Všimnime si, že chýba premenná pre tlačidlo =. Jediná práca s tlačidlom je nastavenie obslužnej metódy pri kliknutí. A pretože sme toto urobili už v minulej časti, priamo v XML návrhu tlačidla parametrom android:onClick="calculate", nemusíme sa o to už starať v Kotline kóde. Možno povedať, že sme tým tiež ušetrili pár riadkov kódu, pretože v Kotline kóde je táto činnosť pracnejšia.

Metóda onCreate()

Metóda onCreate() je tou najdôležitejšou metódou našej aplikácie. Tu totiž, po spustení aplikácie, všetko začína.

Inicializácia premenných

Metóde onCreate() teda teraz doplníme inicializáciu premenných na potrebné komponenty z XML návrhu. Vďaka tomu budeme môcť s týmito objektmi pracovať v Kotline kóde. Umožní nám získavať obsah zadávacích políčok, nastavovať text s výsledkom výpočtu komponentu TextView atď.:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    etNumber1 = findViewById(R.id.etNumber1)
    etNumber2 = findViewById(R.id.etNumber2)
    spinnerOperation = findViewById(R.id.spinnerOperation)
    labelResult = findViewById(R.id.labelResult)
}

Iste ste si všimli, že metóda onCreate() prijíma jeden parameter savedInstanceState. Ten je po spustení aplikácie null. Slúži na ukladanie stavu aplikácie. Napríklad po zmene orientácie zariadenia tento parameter už null nebude a bude obsahovať niektoré dáta aplikácie.

Položky pre Spinner

Na koniec metódy pripíšeme ďalší kód na prípravu položiek pre Spinner:

val operatorsArray = resources.getStringArray(R.array.operators)

Vytvárame tu pole textových reťazcov operatorsArray so štyrmi operátormi: ["+", "-", "*", "/"] pre početné operácie kalkulačky, ktoré budeme užívateľovi ponúkať v rozbaľovacom menu Spinner. Toto pole neinicializujeme priamo, ale hodnotami z poľa operators, nachádzajúceho sa v resources v súbore res/values/strings.xml. Poďme si tam hodnoty deklarovať.

Úprava súboru strings.xml

Súbor strings.xml bol pri vytvorení projektu automaticky vygenerovaný Android Štúdiom a my doň pridáme deklaráciu spomínaného poľa operators:

<resources>
    <string name="app_name">SimpleCalc</string>

    <string-array name="operators">
        <item>+</item>
        <item>-</item>
        <item>*</item>
        <item>/</item>
    </string-array>
</resources>

Prvá položka <string name="app_name">SimpleCalc</string> v súbore strings.xml bola automaticky vygenerovaná pri vytvorení projektu a obsahuje textový reťazec s názvom aplikácie, ktorý je zobrazovaný napríklad v toolbare aplikácie alebo v zozname nainštalovaných aplikácií v používateľovom zariadení.

Všetky textové reťazce sa v Android aplikáciách píšu do strings.xml, aby sa aplikácia dala jednoducho preložiť do viacerých jazykov. U znamienok to zatiaľ nedáva zmysel, ale čo keby sme tam pridali potom nejakú ďalšiu operáciu, ktorá by bola pomenovaná slovom.

Doplnenie metódy onCreate()

Vrátime sa do metódy onCreate() a pokračujeme:

val list = operatorsArray.toList()
val dataAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, list)

Pole možností dosadíme do komponentu Spinner pomocou adaptéra. Ak ste robili formulárové aplikácie v Java Swing, je to podobné. Z vytvoreného poľa operatorsArray vytvárame kolekciu List, ktorú odovzdáme adaptéru pre Spinner, ktorého úlohou je správa položiek zobrazovaných používateľmi. Konštruktor adaptéra prijíma tri parametre:

  • referenciu na aktuálny kontext,
  • referenciu na XML návrh vzhľadu tej položky Spinner, ktorá je aktuálne vybraná,
  • kolekciu s položkami Spinner.
Ďalším riadkom spinnera nastavujeme vzhľad položiek zobrazených v jeho rozbaľovacom menu:
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

Aj tu, podobne ako v prípade vybranej položky, volíme defaultný vzhľad položiek menu. V poslednom riadku metódy onCreate() komponentu Spinner vytvorený adaptér priradíme:

spinnerOperation.adapter = dataAdapter

Metóda calculate()

Teraz si popíšeme jedinú našu vlastnú metódu, ktorú pridáme do súboru MainActivity.kt a ktorá bude obsluhovať udalosť kliknutí na tlačidlo =. Ako sme si už povedali, tlačidlo už máme v XML na metódu napojenú pomocou atribútu android:onClick="calculate".

Aby metóda calculate() mohla na udalosť kliknutia reagovať, musí prijímať parameter typu View, ktorý bude obsahovať, pri volaní metódy, referenciu na ten objekt z XML, od ktorého udalosť prišla. Pokiaľ tento parameter bude chýbať, dôjde po kliknutí na tlačidlo = k pádu aplikácie s chybou IllegalStateException:

Tvorba mobilných aplikácií pre Android v Kotlin

Kód metódy calculate() máme tu:

fun calculate(view: View) {
    val number1: Double
    val number2: Double
    var result = 0.0

    try {
        number1 = etNumber1.text.toString().toDouble()
        number2 = etNumber2.text.toString().toDouble()

        if (spinnerOperation.selectedItem.equals("+")) {
            result = number1 + number2
        } else if (spinnerOperation.selectedItem.equals("-")) {
            result = number1 - number2
        } else if (spinnerOperation.selectedItem.equals("*")) {
            result = number1 * number2
        } else if (spinnerOperation.selectedItem.equals("/")) {
            if (number2 == 0.toDouble()) {
                labelResult.text = "NULOU DĚLIT NELZE!"
                return;
            }

            result = number1 / number2;
        }

        val nf = DecimalFormat("#.##")
        labelResult.text = nf.format(result)
    } catch (e: java.lang.NumberFormatException) {
        labelResult.text = "Chybné zadání..."
    }
}

V úvode metódy calculate() deklarujeme premenné number1 a number2, do ktorých budeme ukladať užívateľom zadané čísla a premennú result pre uloženie výsledku výpočtu.

Ďalší blok kódu je umiestnený v bloku try - catch pre odchytenie prípadnej výnimky NumberFormatException, ku ktorej dôjde pri zadaní nečíselnej hodnoty do jedného z políčok. Konkrétne by k chybe došlo pri prevode dátových typov, kedy bude na mieste výsledku zobrazené hlásenie o chybnom zadaní. Do premenných number1 a number2 ukladáme obsah zadávacích políčok, ktorý načítame ako text a následne ho prevedieme na Double.

Po úspešnom prevode dátových typov dochádza podmienkou if k vetveniu programu do štyroch možných scenárov podľa typu matematickej operácie, ktorá je užívateľom vybraná. Vo všetkých prípadoch do premennej result ukladáme výsledok výpočtu. Ak je požadovanou operáciou delenia, bude druhé zadané číslo otestované na nulovú hodnotu. Pri nulovej hodnote druhého čísla by došlo k porušeniu jedenásteho prikázania - delenie nulou:-) Pokiaľ užívateľ bude chcieť deliť nulou, vypíšeme mu, namiesto výsledku, hlášku o tom, že deliť nulou nemožno a metóda bude ukončená príkazom return.

Po vykonaní úspešného výpočtu prichádza čas na zobrazenie výsledku. Než výsledok zobrazíme v komponente TextView, "preženieme" ho triedou DecimalFormat, ktorá výsledok zaokrúhli na definovaný počet desatinných miest. Až po tejto úprave TextView nastavujeme text v podobe získaného výsledku výpočtu, aby bol zobrazený používateľovi.

Kód kalkulačky týmto máme hotový:)

V nasledujúcom kvíze, Kvíz - Tvorba GUI pre Android aplikácie v Kotline, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Aplikácie zápisník v Kotlin - RelativeLayout a RecyclerView
Všetky články v sekcii
Tvorba mobilných aplikácií pre Android v Kotlin
Preskočiť článok
(neodporúčame)
Kvíz - Tvorba GUI pre Android aplikácie v Kotline
Článok pre vás napísal Marek Urbańczyk
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Kotlinu, Javě. Má také zkušenosti s C#.
Aktivity