Lekce 7 - Android Intenty a aktivity - Zobrazení SumResultActivity
V minulé lekci, Android Intenty a aktivity - Java kód SumResultActivity, jsme odeslali odpověď předchozí Android aktivitě v intentu a deklarovali nové aktivity v souboru manifestu.
V dnešním Android tutoriálu si napíšeme kód pro zobrazení
aktivity SumActivity. V aktivitě
SumResultActivity se naučíme používat odkazy na
textové řetězce.
Úprava kódu aktivity
SumActivity
V aktivitě SumActivity jsme dříve deklarovali metodu
sendData(), kterou jsme nechali prázdnou. Nyní, když už máme
aktivitu SumResultActivity hotovou, můžeme tuto metodu v
aktivitě SumActivity doplnit. Nedávno jsme si říkali o tom, že
otevírání aktivit, po jejichž zavření očekáváme odpověď, prošlo
změnou. Dokumentace původní způsob označuje jako
zastaralý a nahrazuje jej novým postupem. Tato problematika
se týká i těla metody sendData(), proto si ukážeme oba
způsoby.
Původní způsob
Kód metody bude následující:
private void sendData() { Intent sendIntent = new Intent(this, SumResultActivity.class); sendIntent.putExtra("number_1", number1); sendIntent.putExtra("number_2", number2); startActivityForResult(sendIntent, 1); }
Na prvním řádku vytváříme explicitní Intent
vyjadřující konkrétní záměr - spustit
SumResultActivity.class. V následujících dvou řádcích
přiřazujeme data se zadanými čísly. Do parametrů metody
putExtra() píšeme každé číslo s klíčem,
tvořeným textovým řetězcem.
Díky klíčům si čísla vyzvedneme v aktivitě, kterou
instancí typu Intent otevřeme.
V posledním řádku voláme metodu startActivityForResult(),
čímž aktivitu SumResultActivity otevřeme.
Po zavření aktivity SumResultActivity budeme v
aktivitě SumActivity očekávat odpověď s výsledkem
součtu.
Aktivita SumActivity přijímá dva
parametry:
- vytvořenou instanci typu
Intent, requestCode- jde o hodnotu typuint, označující důvod skoku z aktivitySumActivitydo jiné aktivity.
requestCode
Kdykoliv otevřeme jinou aktivitu voláním
startActivityForResult(), bude po jejím zavření v
původní aktivitě volána metoda
onActivityResult().
Volání metody onActivityResult() upozorňuje na
zavření aktivity, ale neříká, o jakou aktivitu šlo, nic o
důvodu jejího otevření a jaká data máme očekávat.
Právě díky parametru requestCode po přijetí
odpovědi víme, jaká aktivita byla otevřena a následně zavřena a tím
pádem i jak na odpověď reagovat, nebo jaká data v odpovědi očekávat.
Může se i stát, že sice víme, která aktivita byla zavřena (např.
proto, že jinou aktivitu ani neotevíráme), ale tato aktivita může mít
schopnost plnit více různých úkolů s různými typy
návratových dat. Díky parametru requestCode pak víme, jaký
úkol byl proveden, tedy jaká data v odpovědi očekávat a jak je
zpracovat.
Nový způsob
Použití nového postupu se od toho původního bude v našem případě
lišit jediným řádkem kódu naší metody sendData(). Jedná se
o její poslední řádek, který nahradíme tímto kódem:
sumActivityResultLauncher.launch(sendIntent);
Na instanci sumActivityResultLauncher typu
ActivityResultLauncher, voláme metodu launch(). Tato
metoda ve svém parametru přijímá instanci typu Intent
určující konkrétní aktivitu, která má být
otevřena.
Vytvoření instance typu Intent se v novém
způsobu neliší od původního způsobu.
Zásadním rozdílem nového způsobu otevření aktivity s
návratovými daty od původního způsobu je v tom, že v novém
postupu neexistuje parametr requestCode, identifikující
druh aktivity, ze které byla vrácena odpověď.
Již víme, že třída konkrétní aktivity, otevírající
další aktivitu, nepřepisuje metodu onActivityResult(). Také
víme, že musíme vytvořit instanci třídy
ActivityResultLauncher.
V přepsané metodě onActivityResult(), z rozhraní
ActivityResultCallback, definujeme co se bude dít po
zavření té konkrétní aktivity. Metoda
onActivityResult() nemá parametr requestCode. Je to
logické, protože se její volání vztahuje právě k jedné
konkrétní aktivitě.
Pro každou aktivitu, kterou z jedné třídy otevíráme,
musíme vytvořit vlastní instanci třídy
ActivityResultLauncher.
Toto si ukážeme později, konkrétně v případě aktivity pro práci s galerií a s fotoaparátem zařízení. Zde budeme mít možnost z jedné naší aktivity otevírat dvě různé systémové aktivity.
Používání odkazů na řetězce
Zobrazovaným zprávám a objektům typu TextView nastavujeme
text pomocí odkazu do resources projektu. Při
vytvoření projektu vygeneruje Android Studio ve složce
res/values/ soubor strings.xml.
Soubor strings.xml slouží k ukládání
textových řetězců, které tak lze v kódu použít vícekrát a na které v
kódu odkazujeme. Je to z důvodu centralizace všech řetězců na jedno
místo, čímž můžeme pak aplikaci jednoduše přeložit do jiného
jazyka.
Aktivita
SumResultActivity
Pojďme si na příkladu ukázat, jak snadno lze v Android Studiu z
použitého textového řetězce vytvořit položku v resources.
Přejděme do aktivity SumResultActivity.
Metoda onCreate()
V aktivitě SumResultActivity se přesuňme do její metody
onCreate(). V této metodě máme blok try -
catch, kterým ošetřujeme vznik výjimky, při které bude
uživateli zobrazena zpráva:
Toast.makeText(this, R.string.incoming_intent_data_error, Toast.LENGTH_LONG).show();
Kód změníme tak, abychom nepoužili odkaz do resources:
Toast.makeText(this, "Chyba přijatých dat...", Toast.LENGTH_LONG).show();
Nyní z textového řetězce vytvoříme odkaz na položku v
res/values/strings.xml. Umístíme kurzor na řetězec
"Chyba přijatých dat..."
Vlevo se objeví žlutá žárovka:

Na tuto žárovku klikneme levým tlačítkem a v menu zvolíme Extract string resource:

V otevřeném okně Extract Resource s předvyplněným textovým
řetězcem v Resource value, napíšeme do Resource name
název, pod jakým bude text uložen v souboru
strings.xml, a potvrdíme tlačítkem OK:

Na konec souboru strings.xml bude přidán nový řádek:

Stejný způsob bychom použili i v XML návrhu GUI, kde bychom
takto nastavovali i barvy. Nastavíme-li někde nějakému elementu barvu
přímo, můžeme ji později, pomocí žluté žárovky, extrahovat do souboru
res/values/colors.xml stejně jako v případě textových
řetězců.
Již umíme otevírat jiné aktivity a předávat data mezi nimi. V dalších
lekcích kurzu si popíšeme funkce ostatních tlačítek ukázkové aplikace
Activities. Prvních pět tlačítek bude
explicitními instancemi typu Intent a budou
otevírat námi vytvořené aktivity. Každá z těchto aktivit bude mít
nějakou funkčnost, spočívající ve vytváření
implicitních instancí typu Intent. Ty zapojují
i systém a jeho defaultní aktivity, jako např. zobrazení mapy, odesílání
SMS nebo fotoaparát.
Níže je k dispozici ke stažení projekt s doplněnou aktivitou
SumActivity a aktivitou SumResultActivity.
V následujícím kvízu, Kvíz - Získávání dat od ukončené aktivity v Androidu, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 6x (2.56 MB)
Aplikace je včetně zdrojových kódů v jazyce Java


