Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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 typu int, označujúcu dôvod skoku z aktivity SumActivity 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ódy sendData(). 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 typu TextView 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:

Android intent a aktivity

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

Android intent a aktivity

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:

Android intent a aktivity

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

Android intent a aktivity

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

 

Predchádzajúci článok
Android Intent a aktivity - MapActivity - Zobrazenie mapy
Všetky články v sekcii
Android intent a aktivity
Preskočiť článok
(neodporúčame)
Android Intent a aktivity - PhoneActivity - Telefón a SMS
Článok pre vás napísal Pavel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity