7. diel - Android Intenty a aktivity - Zobrazenie SumResultActivity
V minulej lekcii, Android Intent a aktivity - MapActivity - Zobrazenie mapy , sme vytvorili vzhľad aktivity MapActivity pre zadanie GPS súradníc a nastavili komponenty ImageButton na vektorové obrázky.
V dnešnom Android tutoriále si napíšeme kód pre zobrazenie
aktivity SumActivity. V aktivite
SumResultActivity sa naučíme používať odkazy na
textové reťazce.
Úprava kódu aktivity
SumActivity
V aktivite SumActivity sme predtým deklarovali metódu
sendData(), ktorú sme nechali prázdnu. Teraz, keď už máme
aktivitu SumResultActivity hotovú, môžeme túto metódu v
aktivite SumActivity doplniť. Nedávno sme si hovorili o tom, že
otváranie aktivít, po ktorých zatvorení očakávame odpoveď, prešlo
zmenou. Dokumentácia pôvodný spôsob označuje ako
zastaraný a nahrádza ho novým postupom. Táto problematika
sa týka aj tela metódy sendData(), preto si ukážeme oba
spôsoby.
Pôvodný spôsob
Kód metódy bude nasledujúci:private void sendData() { Intent sendIntent = new Intent(this, SumResultActivity.class); sendIntent.putExtra("number_1", number1); sendIntent.putExtra("number_2", number2); startActivityForResult(sendIntent, 1); }
Na prvom riadku vytvárame explicitný Intent vyjadrujúci
konkrétny zámer - spustiť
SumResultActivity.class. V nasledujúcich dvoch riadkoch
priraďujeme dáta so zadanými číslami. Do parametrov
metódy putExtra() píšeme každé číslo s
kľúčom, tvoreným textovým reťazcom.
Vďaka kľúčom si čísla vyzdvihneme v aktivite, ktorú
inštanciou typu Intent otvoríme.
V poslednom riadku voláme metódu startActivityForResult(),
čím aktivitu SumResultActivity otvoríme.
Po zatvorení aktivity SumResultActivity budeme v
aktivite SumActivity očakávať odpoveď s výsledkom súčtu.
Aktivita SumActivity prijíma dva
parametre:
- vytvorenú inštanciu typu
Intent, requestCode- ide o hodnotu typuint, označujúcu dôvod skoku z aktivitySumActivitydo inej aktivity.
requestCode
Kedykoľvek otvoríme inú aktivitu volaním
startActivityForResult(), bude po jej zatvorení v
pôvodnej aktivite volaná metóda
onActivityResult().
Volanie metódy onActivityResult() upozorňuje na
zatvorenie aktivity, ale nehovorí, o akú aktivitu išlo, nič
o dôvode jej otvorenia a aké dáta máme očakávať.
Práve vďaka parametru requestCode po prijatí
odpovede vieme, aká aktivita bola otvorená a následne zatvorená a tým
pádom aj ako na odpoveď reagovať, alebo aké dáta v odpovedi
očakávať.
Môže sa aj stať, že síce vieme, ktorá aktivita bola zatvorená (napr.
preto, že inú aktivitu ani neotvárame), ale táto aktivita môže mať
schopnosť plniť viacero rôznych úloh s rôznymi typmi
návratových dát. Vďaka parametru requestCode potom vieme, aká
úloha bola vykonaná, teda aké dáta v odpovedi očakávať a ako ich
spracovať.
Nový spôsob
Použitie nového postupu sa od toho pôvodného bude v našom prípade líšiť jediným riadkom kódu našej metódysendData(). Ide o
jej posledný riadok, ktorý nahradíme týmto kódom:
sumActivityResultLauncher.launch(sendIntent);
Na inštancii sumActivityResultLauncher typu
ActivityResultLauncher, voláme metódu launch().
Táto metóda vo svojom parametri prijíma inštanciu typu Intent
určujúcu konkrétnu aktivitu, ktorá má byť otvorená.
Vytvorenie inštancie typu Intent sa v novom
spôsobe nelíši od pôvodného spôsobu.
Zásadným rozdielom nového spôsobu otvorenia aktivity s
návratovými dátami od pôvodného spôsobu je v tom, že v novom
postupe neexistuje parameter requestCode, identifikujúci
druh aktivity, z ktorej bola vrátená odpoveď.
Už vieme, že trieda konkrétnej aktivity, otvárajúcej
ďalšiu aktivitu, neprepisuje metódu onActivityResult(). Tiež
vieme, že musíme vytvoriť inštanciu triedy
ActivityResultLauncher.
V prepísanej metóde onActivityResult(), z rozhrania
ActivityResultCallback, definujeme čo sa bude diať po
zatvorení tej konkrétnej aktivity. Metóda
onActivityResult() nemá parameter requestCode. Je to
logické, pretože sa jej volanie vzťahuje práve k jednej konkrétnej
aktivite.
Pre každú aktivitu, ktorú z jednej triedy otvárame, musíme
vytvoriť vlastnú inštanciu triedy ActivityResultLauncher.
Toto si ukážeme neskôr, konkrétne v prípade aktivity pre prácu s galériou as fotoaparátom zariadenia. Tu budeme mať možnosť z jednej našej aktivity otvárať dve rôzne systémové aktivity.
Používanie odkazov na reťazce
Zobrazovaným správam a objektom typuTextView nastavujeme text
pomocou odkazu do resources projektu. Pri
vytvorení projektu vygeneruje Android Studio v priečinku
res/values/ súbor strings.xml.
Súbor strings.xml slúži na ukladanie textových
reťazcov, ktoré tak možno v kóde použiť viackrát a na ktoré v kóde
odkazujeme. Je to z dôvodu centralizácie všetkých reťazcov na jedno miesto,
čím môžeme potom aplikáciu jednoducho preložiť do iného jazyka.
Aktivita
SumResultActivity
Poďme si na príklade ukázať, ako ľahko je možné v Android Štúdiu z
použitého textového reťazca vytvoriť položku v resources.
Prejdime do aktivity SumResultActivity.
Metóda onCreate()
V aktivite SumResultActivity sa presuňme do jej metódy
onCreate(). V tejto metóde máme blok try -
catch, ktorým ošetrujeme vznik výnimky, pri ktorej bude
užívateľovi zobrazená správa:
Toast.makeText(this, R.string.incoming_intent_data_error, Toast.LENGTH_LONG).show();
Kód zmeníme tak, aby sme nepoužili odkaz do resources:
Toast.makeText(this, "Chyba přijatých dat...", Toast.LENGTH_LONG).show();
Teraz z textového reťazca vytvoríme odkaz na položku v
res/values/strings.xml. Umiestnime kurzor na reťazec
"Chyba přijatých dat..."
Vľavo sa objaví žltá žiarovka:

Na túto žiarovku klikneme ľavým tlačidlom av menu zvolíme Extract string resource:

V otvorenom okne Extract Resource s predvyplneným textovým
reťazcom v Resource value, napíšeme do Resource name
názov, pod akým bude text uložený v súbore
strings.xml, a potvrdíme tlačidlom OK:

Na koniec súboru strings.xml bude pridaný nový riadok:

Rovnaký spôsob by sme použili aj v XML návrhu GUI, kde by
sme takto nastavovali aj farby. Ak nastavíme niekde nejakému elementu farbu
priamo, môžeme ju neskôr, pomocou žltej žiarovky, extrahovať do súboru
res/values/colors.xml rovnako ako v prípade textových
reťazcov.
Už vieme otvárať iné aktivity a odovzdávať údaje medzi nimi. V
ďalších lekciách kurzu si popíšeme funkcie ostatných tlačidiel
ukážkovej aplikácie Activities. Prvých päť tlačidiel bude
explicitnými inštanciami typu Intent a budú
otvárať nami vytvorené aktivity. Každá z týchto aktivít bude mať nejakú
funkčnosť, spočívajúcu vo vytváraní implicitných
inštancií typu Intent. Tie zapájajú aj systém a jeho
defaultné aktivity, ako napr. zobrazenie mapy, odosielanie SMS alebo
fotoaparát.
Nižšie je k dispozícii na stiahnutie projekt s doplnenou aktivitou
SumActivity a aktivitou SumResultActivity.
V budúcej lekcii, Android Intent a aktivity - PhoneActivity - Telefón a SMS , si pripravíme XML layout pre ovládanie telefónu a SMS.
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é 6x (2.56 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

