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