NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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 typu int, označující důvod skoku z aktivity SumActivity 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:

Android Intenty a aktivity

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

Android Intenty a aktivity

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:

Android Intenty a aktivity

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

Android Intenty a aktivity

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

 

Předchozí článek
Android Intenty a aktivity - Java kód SumResultActivity
Všechny články v sekci
Android Intenty a aktivity
Přeskočit článek
(nedoporučujeme)
Kvíz - Získávání dat od ukončené aktivity v Androidu
Článek pro vás napsal Pavel
Avatar
Uživatelské hodnocení:
2 hlasů
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity