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