Nadšenci do Androidu, chcete se naučit programovat? Pokračujeme v kurzu

Naše minulá aplikace byla menším kvízem, na kterém jsme předvedli základní principy programování pro nejrozšířenější mobilní operační systém současnosti. Dnes budeme pokračovat a přidáme seznam s výsledky účastníků našeho kvízu.

Programování pro operační systém Android. Ilustrační foto | foto: Mobil | foto: Michal Havryluk, Mobil.iDNES.cz

Než se pustíte do čtení tohoto dílu kurzu, doporučujeme projít nejprve první díl (o začátcích programování se dočtete v dřívějším článku Naučíme vás programovat aplikace pro Android. Začínáme), v němž jsme probírali instalace potřebných nástrojů a první krůčky na platformě Android. V dnešní části budeme na těchto základech stavět a bez nich byste se mohli velice snadno ztratit. K původnímu kvízu nyní přidáme výsledkovou tabulku účastníků. Součástí bude i uložení vašeho nejlepšího skóre do vnitřní paměti zařízení.

Ukládání do sdíleného nastavení

Předtím, než se vůbec pustíme do zobrazování statistik, potřebujeme nejprve uložit skóre po skončení kvízu. Na platformě Android existuje několik způsobů pro uložení dat. Kromě zápisu do běžného souboru můžeme využít služeb SQLite databáze nebo klidně výsledky ukládat na vzdálený server. Toto jsou však poměrně složité způsoby, které prozatím přeskočíme.

Oficiální příručka

Tento článek není v žádném případě náhradou za oficiální materiály z Android Developers Guide. Je spíše malým okénkem do světa programování pro operační systém Android. Zdrojový kód rovněž nemá ideální podobu a byl velmi zjednodušen pro potřeby tohoto článku.

Nejjednodušší je využít schopností SharedPreferences (v překladu sdílené nastavení), které slouží většinou pro ukládání nastavení ve formě jednoduchých datových položek. Ty jsou uloženy do xml souboru do prostoru vymezeného pro vaši aplikaci. Pokud neurčíte jinak, tak jsou dostupné výhradně pro vaši aplikaci. Toto určuje parametr mode při přístupu k danému sdílenému nastavení.

V našem případě si vytvoříme právě takový soubor a po skončení kvízu do něj uložíme nejvyšší skóre. Vše prozatím provádíme v rámci třídy QuizActivity a metody showStatistics. Nezapomeňte vždy po skončení práce s editorem SharedPreferences použít příkaz commit, jinak se zapsané hodnoty neuloží. Následujícím krokem je přidání dalšího tlačítka na úvodní obrazovku u třídy MainActivity. To bude směřovat na nově vytvořenou třídu ScoreActivity, kde už nás čeká vytváření seznamu výsledků.

Jeden View vládne všem

Jak už víme z minula, třída View zastřešuje všechny prvky, které můžeme umístit do layoutu od textového pole (TextView) až třeba po tlačítka (Button). Nejrozšířenějším View na Androidu je s přehledem ListView, který slouží k zobrazení seznamu libovolných položek, což jsou zase další View. V našem případě využijeme ListView pro zobrazení řádků, v nichž bude jméno účastníka kvízu a jeho skóre. Tyto údaje jsou pokaždé vytvořeny při otevření ScoreActivity a hodnoty zapsané přímo v aplikaci. V ideálním případě by se stahovaly ze serveru, kam by se výsledky zapisovaly z jednotlivých zařízení.

Náš ListView je v layoutu umístěn v tzv. RelativeLayoutu v souboru score.xml. Tento RelativeLayout umožňuje umisťovat View v něm obsažené relativně podle pozice okolních View. Typicky tedy budete nastavovat, že jeden View je napravo od druhého nebo se má ukotvit na spodní okraj svého rodiče. Různých kombinací je bezpočet. Pokud View nemá žádné údaje o tom, jak se má pozicovat, je umístěn do levého horního rohu. Dobré je vědět, že View se mohou vzájemně překrývat.

Programování pro operační systém Android

V našem případě jsme použili RelativeLayout k tomu, abychom jednak umístili nejvyšší skóre aktuálního účastníka kvízu nad celý seznam a také tlačítko pro vymazání řádku ze skóre, které bude vždy v dolním okraji obrazovky. Jak si můžete v aplikaci všimnout, není to příliš šikovná kombinace a poslední řádky ListView nejsou vidět. V rámci kódu ještě přidáme tzv. header, což bude hlavička seznamu umístěná jako první řádek. Hodí se rovněž upozornit, že se nikdy nesmí umisťovat ListView do ScrollView.

Chybějící spojka

K dispozici již tedy máme ArrayList se seznamem účastníků a ListView, do kterého budou tyto položky v podobě View řádků umístěny. Chybí nám pouze spojka, která tyto dva světy propojí. Tím je v Androidu tzv. adaptér, který se kromě ListView používá i pro jiné účely. Prakticky vždy však dělá to, že vezme hodnoty položky z ArrayListu, vytvoří k nim odpovídající View a ten umístí do ListView.

Náš adaptér má název ScoreArrayAdapter a při jeho vytváření jsme museli implementovat několik povinných metod, které jsou nutné pro funkci celého ListView. Byly to metody většinou pro získání položky na dané pozici nebo celkového množství položek v seznamu. Implementace těchto metod není žádná věda, ale zkrátka je musíme napojit na náš ArrayList.

Tou nejdůležitější metodou v adaptéru je getView, která se stará o vytvoření a úpravu položek. V rámci platformy Android je totiž vždy vytvořeno pouze tolik View řádků, kolik je jich aktuálně na displeji. Váš seznam tak může mít klidně tisíce a tisíce řádků, ale daných View pro potřeby ListView je vždy vytvořeno například deset. Použité View jsou v drtivé většině případů totožné a mění se pouze jejich obsah. Touto metodou se výrazně šetří paměť a celková náročnost na vytvoření tisíce položek. Celý popis práce adaptéru berte spíše s rezervou a princip je ještě o něco složitější.

Recyklace klíčem k úspěchu

Při vytvoření ListView je tak vytvořeno pouze například zmiňovaných deset řádků, které se při pohybu recyklují. Pokud tedy uživatel zobrazí jedenáctou pozici v seznamu, tak první řádek je ze seznamu odebrán a okamžitě se přemístí na zmíněnou jedenáctou pozici.

Adaptér se však postará o aktualizaci jeho hodnot, aby skutečně odpovídaly této pozici v seznamu. Bez toho by v ní zůstaly údaje z prvního řádku. V metodě getView se tento recyklovaný řádek dostává v podobě tzv. convertView, který se následně upravuje.

Programování pro operační systém Android

V naší metodě getView tudíž nejprve zkontrolujeme, jestli je convertView prázdný (null), což by znamenalo, že je potřeba položku nejprve vytvořit. K tomuto účelu je použit tzv. LayoutInflater, který je schopný vzít xml soubor s layoutem a vytvořit z něj potřebný View. Tento soubor máme již připravený ve složce layouts. Třídy LayoutInflater jsme využili i pro vytvoření hlavičky ListView v předchozí sekci.

Pokud nebyl convertView prázdný nebo jsme ho právě vytvořili, je potřeba ještě nastavit údaje u TextView, aby odpovídaly pozici, kde se má tento View zobrazit. V našem případě to znamená získat objekt na této pozici v ArrayListu a následně odpovídající jméno účastníka a jeho skóre.

Perličkou na závěr je obarvení pozadí každého druhého řádku tmavší barvou, aby se údaje lépe četly. Toho dosáhneme provoláním metody setBackgroundColor na daný View řádek. Avšak pozor, musí existovat také druhá varianta, která nastaví průhledné pozadí řádku. Pokud by tato varianta neexistovala, dočkali bychom se nemilého překvapení při pohybu v ListView.

Mazání konkurence

V ScoreActivity je umístěno ještě jedno tlačítko pro vymazání první pozice seznamu výsledků. Po jeho stisknutí je provolána metoda deleteItem u našeho adaptéru, kdy je položka odstraněna z ArrayListu. Velice podstatné je provolání metody notifyDataSetChanged, kdy informujeme adaptér, že došlo ke změně dat a je nutné ho překreslit. Pokud bychom to neudělali, nic by se na první pohled nestalo.

Programování pro operační systém Android

ListView může být kromě hodnot z ArrayListu plněn i hodnotami z tzv. Cursoru přímo z databáze, což je ještě efektivnější postup pro plnění ListView. I v jeho rámci je potřeba zavolat, že došlo ke změně datové základny a je potřeba ListView znovu překreslit.

Úkoly pro vás

Stejně jako minule jsou k dispozici dva Eclipse projekty. Oba jsou náležitě okomentovány a mělo by z nich být jasné, jak se s aplikací pracuje. První projekt obsahuje kompletní zdrojové kódy aplikace. Druhý projekt má odmazané některé části kódu, konkrétně uložení nejlepšího výsledku po skončení celého kvízu. Pro tento účel se používá tzv. Editor, který získáte z daného SharedPrefences provoláním metody edit. Vodítko, jak pracovat se SharedPreferences, je ukázáno hned v úvodu ScoreActivity.

Druhým úkolem je přidání obarvování každého druhého řádku v seznamu tmavší barvou. K tomu použijete metodu setBackgroundColor, která bude mít jako svůj parametr zvolenou barvu. Tu si můžete vytvořit samozřejmě vlastní, ale v rámci zjednodušení doporučujeme použít barvy standardně obsažené u každého androidího zařízení. Jsou jimi například barvy android.R.color.darker_gray a android.R.color.transparent. Pro jejich získání provolejte metody context.getResources().getColor().

Na závěr pro jistotu ještě upozornění. Máte-li ještě uložený původní projekt z předchozího článku, tak ho v Eclipse vymažte a importujte jeden z výše uvedených projektů.

  • Nejčtenější

Podívejte se na fotografie vylepšené umělou inteligencí. Nadchla i Google

12. března 2024  7:02

I nejlepší fotomobil může trpět řadou nedokonalostí, které se projeví na výsledných fotografiích....

Vyzkoušeli jsme za vás kontroverzní Temu. Drobnosti za desetikoruny

19. března 2024

Internetový obchod Temu budí kontroverze. U influencerů je neuvěřitelně populární a jejich...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

O2 dává neomezená data s příjemnou slevou. Avšak pouze dočasně

14. března 2024  7:02

Neomezená data s přenosovou rychlostí 10 Mbit/s představují až na jednu výjimkou základ nabídky...

KOMENTÁŘ: Za pár let budeme rozvojovým zemím závidět jejich mobilní sítě

16. března 2024

Premium Je dost možné, že za pár let budou mít v rozvojových zemích lepší mobilní sítě, než jaké budou...

{NADPIS reklamního článku dlouhý přes dva řádky}

{POPISEK reklamního článku, také dlouhý přes dva a možná dokonce až tři řádky, končící na tři tečky...}

Ultrasamsung možná přiměje zastánce klasiky přejít ke skládačce

15. března 2024  6:57

Samsung podle dostupných informací chystá hned dva modely řady Galaxy Z Fold, kterých bychom se...

VIDEO: Střílej po mně! Kameraman natočil téměř celý útok v centru Prahy

Premium Ve čtvrtek zemřelo rukou střelce Davida K. 14 obětí, 25 lidí je zraněných, z toho deset lidí těžce. Jedním z prvních na...

Máma ji dala do pasťáku, je na pervitinu a šlape. Elišku čekají Vánoce na ulici

Premium Noční Smíchov. Na zádech růžový batoh, v ruce svítící balónek, vánoční LED svíčky na baterky kolem krku. Vypadá na...

Test světlých lahvových ležáků: I dobré pivo zestárne v obchodě mnohem rychleji

Premium Ležáky z hypermarketů zklamaly. Jestli si chcete pochutnat, běžte do hospody. Sudová piva totiž dopadla před časem...

Chytrému prstenu Samsung hodně věří. Na start bude mít připravené zásoby

19. března 2024

Samsung by měl chytrý prsten Galaxy Ring představit 10. července spolu s novými skládačkami. Prodej...

Vyzkoušeli jsme za vás kontroverzní Temu. Drobnosti za desetikoruny

19. března 2024

Internetový obchod Temu budí kontroverze. U influencerů je neuvěřitelně populární a jejich...

VIDEO: Apple zfilmoval kultovní komiks. Zamířil kvůli tomu do Japonska

18. března 2024  6:57

Děj nového krátkometrážního snímku, jehož prostřednictvím Apple tradičně demonstruje přednosti...

Chytré, nebo klasika? Mrkněte na hodinky Casio inspirované Apple Watch

18. března 2024

Značka Casio letos oslavuje 50 let výroby svých náramkových hodinek a patří na tomto poli k...

Rozdáváme hygienické pomůcky ZDARMA!
Rozdáváme hygienické pomůcky ZDARMA!

Hledáte udržitelnou a kvalitní hygienickou péči pro sebe i vaše miminko? Už dál nemusíte. Zapojte se do testování a vyzkoušejte produkty ECO by...

Nutný výchovný pohlavek, souhlasí Bouček i Havlová s přerušením projevu na Lvu

Moderátor Libor Bouček ostře zareagoval na kauzu ohledně délky proslovu režisérky Darji Kaščejevové na předávání cen...

Švábi, vši a nevychované děti. Výměna manželek skončila už po pěti dnech

Nová Výměna manželek trvala jen pět dní, přesto přinesla spoustu vyhrocených situací. Martina ze Znojma se pokoušela...

Vyzkoušeli jsme podvod z Aliexpressu. Může vás přijít draho, i po letech

Nakoupili jsme na Aliexpressu a pěkně se spálili. Jednu USB paměť, dvě externí SSD a jeden externí HDD. Ve třech...

Chtěli, abych se vyspala s Baldwinem kvůli jeho výkonu, říká Sharon Stone

Herečka Sharon Stone (66) jmenovala producenta, který jí řekl, aby se vyspala s hercem Williamem Baldwinem (61). Měla...

Byla to láska na první pohled, říká hvězda Gilmorek o manželství s modelkou

Milo Ventimiglia (46), představitel Jesse ze seriálu Gilmorova děvčata nebo Jacka Pearsona ze seriálu Tohle jsme my, je...