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 aktivitySumActivity
do 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