ˇ ´IRODOVEDECK ˇ ´ FAKULTA UNIVERZITY PALACKEHO ´ PR A KATEDRA INFORMATIKY
´ RSK ˇ ´ PRACE ´ BAKALA A
Klient Stagu pro Android
2012
Radim Peˇsek
Anotace V pr´aci popisuji problematiku v´yvoje aplikac´ı pro operaˇcn´ı syst´em Android, kde pˇredstav´ım z´akladn´ı stavebn´ı kameny aplikac´ı kaˇzd´eho projektu pro tento operaˇcn´ı syst´em a toto vˇse pak demonstruji na k´odu vlastn´ı implementace jednoduch´eho klienta IS/STAG pro tuto platformu. Aplikace pˇreb´ır´ a informace z veˇrejn´eho rozhran´ı IS/STAG za vyuˇzit´ı webov´ych sluˇzeb nad IS/STAG. Pr´ace rovnˇeˇz obsahuje pˇredstaven´ı operaˇcn´ıho syst´emu Android a informaˇcn´ıho syst´emu IS/STAG.
Dˇekuji sv´emu vedouc´ımu pr´ace Mgr. Janu Outratovi, Ph.D. za podnˇetn´e rady, vstˇr´ıcnost a v neposledn´ı ˇradˇe tak´e za vyps´an´ı tohoto t´ematu, kter´e mˇe zaujalo natolik, ˇze se chci v´ yvoji aplikac´ı pro operaˇcn´ı syst´em Android vˇenovat i v budoucnu.
Obsah 1. Pˇ redstaven´ı projektu
8
2. Informaˇ cn´ı syst´ em IS/STAG 2.1. Co je to IS/STAG . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Moˇznosti v´ ymˇeny dat s IS/STAG . . . . . . . . . . . . . . . . . . 2.3. Popis rozhran´ı Webov´ ych sluˇzeb . . . . . . . . . . . . . . . . . . .
8 8 9 9
3. Android 3.1. Co je Android . . . . . . . . . 3.1.1. Architektura Androidu 3.2. Vyuˇzit´ı Androidu . . . . . . . 3.3. Pˇrehled verz´ı . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
4. V´ yvoj aplikac´ı pro platformu Android 4.1. Jak zaˇc´ıt programovat . . . . . . . . . . . . . . . . 4.1.1. Bez ˇceho se neobejdete . . . . . . . . . . . . 4.1.2. Pˇrehled moˇzn´ ych v´ yvojov´ ych prostˇred´ı . . . 4.1.3. V´ yvojov´e prostˇred´ı Eclipse . . . . . . . . . . 4.1.4. Zaloˇzen´ı nov´eho projektu v Eclipse . . . . . 4.1.5. Popis adres´aˇrov´e struktury Android projektu 4.2. Moˇzn´e pˇr´ıstupy k programov´an´ı GUI . . . . . . . . 4.2.1. Programov´ y zp˚ usob tvorby GUI . . . . . . . 4.2.2. Deklarativn´ı ˇreˇsen´ı tvorby GUI . . . . . . . 4.3. Z´akladn´ı stavebn´ı kameny . . . . . . . . . . . . . . 4.3.1. Activity . . . . . . . . . . . . . . . . . . . . 4.3.2. Widget . . . . . . . . . . . . . . . . . . . . . 4.3.3. Intent . . . . . . . . . . . . . . . . . . . . . 4.3.4. ListView . . . . . . . . . . . . . . . . . . . . 4.3.5. Adapter . . . . . . . . . . . . . . . . . . . . 4.4. Dalˇs´ı prvky pouˇzit´e v projektu . . . . . . . . . . . . 4.4.1. Menu . . . . . . . . . . . . . . . . . . . . . . 4.4.2. GridView . . . . . . . . . . . . . . . . . . . 4.4.3. WebView . . . . . . . . . . . . . . . . . . . 4.4.4. Preferences . . . . . . . . . . . . . . . . . . 4.5. Zpracov´an´ı dat z IS/STAG . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . . . . . . . . . . . . . . .
. . . .
10 11 11 13 13
. . . . . . . . . . . . . . . . . . . . .
14 14 14 15 15 16 16 18 18 19 20 21 23 24 25 26 29 29 31 34 36 37
Z´ avˇ er
39
Conclusions
40
Reference
41
4
A. Zdrojov´ y k´ od ExamListBaseAdapter.java
42
B. Zdrojov´ y XML k´ od preferences.xml
44
C. Obsah pˇ riloˇ zen´ eho CD
45
5
Seznam obr´ azk˚ u 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Logo operaˇcn´ıho syst´emu Android . . . . . . . . . . . . . . Uk´azka operaˇcn´ıho syst´emu Android . . . . . . . . . . . . Menu Nastaven´ı operaˇcn´ıho syst´emu Android . . . . . . . Pˇrid´an´ı ADT Pluginu . . . . . . . . . . . . . . . . . . . . . Adres´aˇrov´a struktura projektu . . . . . . . . . . . . . . . . Rozvrh hodin . . . . . . . . . . . . . . . . . . . . . . . . . Obrazovka ukazkov´e Activity . . . . . . . . . . . . . . . . Uk´azka widgetu EditText a Button . . . . . . . . . . . . . Uk´azka widgetu RadioButton . . . . . . . . . . . . . . . . Uk´azka jednoduch´eho seznamu ListView . . . . . . . . . . Uk´azka komplexn´ıho seznamu ListView . . . . . . . . . . . Blokov´e sch´ema Adapteru . . . . . . . . . . . . . . . . . . Menu voleb (ˇcervenˇe vyznaˇceno) . . . . . . . . . . . . . . . Uk´azka dvou-dimezion´aln´ıho zobrazen´ı mˇr´ıˇzkou - GridView Uk´azka prvku WebView . . . . . . . . . . . . . . . . . . . Uk´azka Preferences . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
11 12 12 16 17 20 23 24 24 25 25 27 30 32 34 36
Seznam tabulek 1.
Pˇrehled kl´ıˇcov´ ych verz´ı Androidu . . . . . . . . . . . . . . . . . .
7
13
1.
Pˇ redstaven´ı projektu
Projekt sezn´am´ı ˇcten´aˇre s problematiku v´ yvoje aplikac´ı pro operaˇcn´ı syst´em Android a poskytne nˇekter´a m´alo dokumentovan´a fakta o moˇznostech v´ yvoje pro tuto platformu. V´ ysledkem pr´ace je jednoduch´ y klient STAGu, kter´ y zprostˇredkov´av´a data uloˇzen´a v IS/STAG pomoc´ı webov´ ych sluˇzeb nad IS/STAG. Klient byl c´ılen pro potˇreby student˚ u, takˇze vˇetˇsina funkc´ı je urˇcena student˚ um, nicm´enˇe jsem se na posledn´ı chv´ıli rozhodl (v reakci na pozn´amku m´eho vedouc´ıho pr´ace) dodˇelat i p´ar funkc´ı pro uˇcitele, aby mˇela aplikace ˇsirˇs´ı z´abˇer potencion´aln´ıch uˇzivatel˚ u.
2.
Informaˇ cn´ı syst´ em IS/STAG IS/STAG je zkratka pˇredstavuj´ıc´ı n´azev Informaˇcn´ı Syst´em STudijn´ı AGendy.
2.1.
Co je to IS/STAG
Jedn´a se informaˇcn´ı syst´em, kter´ y byl vyvinut Centrem informatizace a v´ ypoˇcetn´ı techniky na Z´apadoˇcesk´e univerzitˇe v Plzni, kde byl tak´e poprv´e pouˇzit a nasazen do provozu. Postupnˇe se rozˇs´ıˇril na dalˇs´ı ˇskoly a v roce 2010 ho pouˇz´ıvalo jiˇz 16 ˇskol vˇcetnˇe Univerzity Palack´eho v Olomouci. Informaˇcn´ım syst´em pokr´ yv´a veˇskerou studijn´ı agendu od pˇrij´ımac´ıch ˇr´ızen´ı aˇz po vyd´an´ı diplomu a to v prezenˇcn´ı, kombinovan´e formˇe i formˇe celoˇzivotn´ıho vzdˇel´av´an´ı. Lze ho pouˇz´ıt pro vysok´e ˇskoly i pro vyˇsˇs´ı odborn´e ˇskoly. Informaˇcn´ı syst´em obsahuje tyto moduly: • studijn´ı programy, obory pl´any a pˇredmˇety • kompletn´ı evidenci studenta • pˇrij´ımac´ı ˇr´ızen´ı • rozvrhy • pˇredz´apis • zkouˇsky • semestr´aln´ı pr´ace • mobility student˚ u • evaluace • pˇredpisy plateb 8
• evidenci absolvent˚ u, kvalifikaˇcn´ıch prac´ı a z´avˇereˇcn´ ych zkouˇsek Pro pr´aci s IS/STAG je moˇzn´e zvolit nˇekterou z n´asleduj´ıc´ıch moˇznost´ı: 1. Nativn´ı klient - aplikace nainstalovan´a na pracovn´ı stanici. Je k dispozici pro operaˇcn´ı syst´em Microsoft Windows (XP a vyˇsˇs´ı). Nativn´ıho klienta pouˇz´ıvaj´ı pˇredevˇs´ım rozvrh´aˇri, studijn´ı oddˇelen´ı a spr´avci fakult a kateder. 2. Webov´e str´anky a port´al - k pˇr´ıstupu staˇc´ı m´ıt internetov´ y prohl´ıˇzeˇc. Nab´ız´ı funkce urˇcen´e pˇredevˇs´ım pro studenty a uˇcitele.
2.2.
Moˇ znosti v´ ymˇ eny dat s IS/STAG
IS/STAG nab´ız´ı moˇznosti komunikace s dalˇs´ımy poˇc´ıtaˇcov´ ymi syst´emy pomoc´ı veˇrejn´eho rozhran´ı. V pˇredchoz´ı kapitole jsem popsal komunikaci na u ´rovni uˇzivatele, ale v t´eto kapitole to bude komunikace orientovan´a na stroje. D´ıky tomuto rozhran´ı mohou napˇr´ıklad vyuˇcuj´ıc´ı, vedouc´ı si vlastn´ı datab´azi bod˚ u ˇci z´apoˇct˚ u, na konci semestru naimportovat soubor ve form´atu XLS do IS/STAG a nen´ı tedy nutn´e, aby tyto u ´daje opisoval do IS/STAG. Dalˇs´ı moˇznost´ı vyuˇzit´ı je um´ıstˇen´ı seznamu pˇredmˇet˚ u, uˇcitel˚ u ˇci studijn´ıch program˚ u z IS/STAG a jejich um´ıstˇen´ı na str´anky kateder - seznamy tak budou vˇzdy odpov´ıdat aktu´aln´ımu stavu dle IS/STAG. V´ ystupy z IS/STAG mohou b´ yt v n´asleduj´ıc´ıch form´atech: XML, XLS (Microsoft Excel), CSV (obecn´ y textov´ y soubor) ˇci kalend´aˇrov´ y form´at iCal.
2.3.
Popis rozhran´ı Webov´ ych sluˇ zeb
Webov´e sluˇzby jsou z uˇzivatelsk´eho pohledu m´ısta na internetu s konkr´etn´ı adresou (URL), kde bˇeˇz´ı sluˇzba zpracovavaj´ıc´ı poˇzadavky. Poˇzadavkem m˚ uˇze b´ yt operace ˇcten´ı nebo z´apisu dat do IS/STAG. Webov´e sluˇzby nad IS/STAG poskytuj´ı dva typy aplikaˇcn´ıho rozhran´ı: REST a SOAP. Prvnˇe jmenovan´ y typ rozhran´ı je bl´ıˇze uˇzivatel˚ um a typ SOAP je pˇrev´aˇznˇe pro komunikace typu strojstroj. Protoˇze ve sv´e aplikaci Klient Stagu pro Android pouˇz´ıv´am typ rozhran´ı REST a v´ ystupn´ı form´at XML, uvedu pˇr´ıklad pˇr´ımo z vlatn´ı aplikace tj. rozhran´ı REST. Mˇejme tedy n´asleduj´ıc´ı URL: https://stagservices.upol.cz/ws/services/rest/predmety/ getPredmetyByStudent?osCislo=R090374\&semestr=LS Popis jednotliv´ ych ˇc´ast´ı URL: • https://stagservices.upol.cz/ws/services/ - z´akladn´ı adresa webov´ ych sluˇzeb nad IS/STAG 9
• rest/predmety/ - adresa konkr´etn´ı sluˇzby • getPredmetyByStudent - n´azev konkr´etn´ı metody, kterou zisk´av´ame nebo zas´ıl´ame data (v tomto pˇr´ıpadˇe z´ısk´av´ame) • osCislo=R090374&semestr=LS - parametry metody (osobn´ı ˇc´ıslo studenta R090374 a parametr semest ud´av´a letn´ı semestr) Jako v´ ysledek obdrˇz´ıme od serveru odpovˇed’ ve form´atu XML, kter´a bude obsahovat vˇsechny pˇredmˇety studenta s osobn´ım ˇc´ıslem R090374 v letn´ım semestru. Obsah takov´eho XML souboru vypad´a n´asledovnˇe: <ns1:getPredmetyByStudentResponse> <predmetyStudenta> <predmetStudenta>
YSOFI Softwarov´ e inˇ zen´ yrstv´ ı KMI 2011 9 . . . <predmetStudenta>
YINFS Informaˇ cn´ ı syst´ emy KMI 2011 9 Tato data jiˇz je moˇzn´e strojovˇe zpracov´avat a pouˇz´ıt je ve sv´ ych aplikac´ıch napˇr´ıklad na webov´ ych str´ank´ach nebo v m´em pˇr´ıpadˇe v aplikaci pro platformu Android. Nejprve jsem ˇcerpal informace ohlednˇe IS/STAG z dokumentace webov´ ych sluˇzeb Univerzity Palack´eho [5], nicm´enˇe jsem se jeˇstˇe poohl´edl jinde a naˇsel jsem dokumentaci webov´ ych sluˇzeb Z´apadoˇcesk´e Univerzity v Plzni [6], kter´a mˇela bohatˇs´ı moˇznosti a byla k dispozici i podrobnˇejˇs´ı dokumentace. Pravdˇepodobnˇe je to d´ıky tomu, ˇze na t´eto univerzitˇe IS/STAG vznikl, a proto je zde nejl´epe zdokumentov´an.
3.
Android 10
3.1.
Co je Android
Android je operaˇcn´ı syst´em urˇcen´ y pro mobiln´ı zaˇr´ızen´ı, kter´ y je zaloˇzen´ y na Linuxov´em j´adˇre verze 2.6. Vznikl spojen´ım firmy Android Inc. s firmou Google Inc. a jejich spolupr´ac´ı - Google odkoupil p˚ uvodn´ı firmu Android Inc. a udˇelal z n´ı v roce 2005 svou dceˇrinou spoleˇcnost. V pr˚ ubˇehu roku 2007 byl prezentov´an prvn´ı produkt tohoto spojen´ı - Android, otevˇren´a platforma pro mobiln´ı zaˇr´ızen´ı. Ten sam´ y rok byl pˇredstaven tak´e n´astroj pro v´ yvoj´aˇre Android SDK, kter´ y byl vyd´an pod licenc´ı open-source. Prvn´ı komerˇcnˇe dostupn´ y telefon s Androidem byl vyroben firmou HTC a uveden na trh koncem roku 2008 a s n´ım i SDK verze 1.0. V dobˇe vzniku t´eto pr´ace je nejrozˇs´ıˇrenˇejˇs´ı verz´ı Androidu verze 2.3.x s k´odov´ ym oznaˇcen´ım Gingerbread - v´ıce informac´ı o vˇsech dostupn´ ych verz´ıch operaˇcn´ıho syst´emu Android jsem shrnul do tabulky 1. v sekci Pˇrehled verz´ı. Operaˇcn´ı syst´em Android pozn´ate podle znaku zelen´eho robota, jak ilustruje obr´azek 1. - logo operaˇcn´ıho syst´emu Android. Tento symbol je pouˇz´ıv´an i v´ yrobci hardwaru, kteˇr´ı j´ım oznaˇcuj´ı zaˇr´ızen´ı s nainstalovan´ ym operaˇcn´ım syst´emem Android.
Obr´azek 1. Logo operaˇcn´ıho syst´emu Android Na obr´azku 2. je uk´azka prostˇred´ı operaˇcn´ıho syst´emu Android zobrazuj´ıc´ı nainstalovan´e aplikace a na obr´azku 3. je zobrazeno menu Nastaven´ı, kter´e umoˇzn ˇuje uˇzivateli nastavit chov´an´ı mobiln´ıho zaˇr´ızen´ı. Konkr´etn´ı zobrazen´ı se m˚ uˇze liˇsit podle v´ yrobce, protoˇze kaˇzd´ y v´ yrobce si prostˇred´ı Androidu vylepˇsuje sv´ ymi n´astavbami tak, aby uˇzivatel˚ um poskytli v z´akladn´ı v´ ybavˇe mobiln´ıho zaˇr´ızen´ı v´ıce moˇznost´ı ˇci funkc´ı. 3.1.1.
Architektura Androidu
Architektura Androidu je pˇetivrstv´a a tvoˇr´ı ji tyto vrstvy (vyjmenov´any od nejniˇzˇs´ı vrstvy): j´adro syst´emu, knihovny, Android Runtime (Dalvik), Application framework a nejvyˇsˇs´ı vrstvu tvoˇr´ı tzv. z´akladn´ı aplikace. J´adro syst´emu je, jak jiˇz jsem zm´ınil, zaloˇzeno na redukovan´em Linuxov´em j´adˇre verze 2.6 a obsahuje spr´avu pamˇeti, s´ıt´ı, proces˚ u, zabudovan´e ovladaˇce. Neobsahuje vˇsak grafick´e uˇzivatelsk´e rozhran´ı X Window. Vrstva knihoven je poskytov´ana v´ yvoj´aˇr˚ um prostˇrednictv´ım vrstvy Application framework a obsahuje knihovny pro pˇrehr´av´an´ı multimedi´aln´ıch soubor˚ u, knihovny webov´eho prohl´ıˇzeˇce, libc - pˇrizp˚ usoben´a pro mobiln´ı zaˇr´ızen´ı, 11
Obr´azek 2. Uk´azka operaˇcn´ıho syst´emu Android
Obr´azek 3. Menu Nastaven´ı operaˇcn´ıho syst´emu Android
odhlehˇcen´ y datab´azov´ y engine SQLite, secure socket layer, Knihovnu pro vykreslov´an´ı bitmapov´ ych a vektorov´ ych font˚ u a OpenGL knihovnu pro vykreslov´an´ı 3D grafiky. Android Runtime vrstva m´a v sobˇe virtualizaˇcn´ı stroj znam´ y jako Dalvik (Dalvik Virtual Machine zkr´acenˇe DVM), kter´ y vyuˇz´ıv´a z´akladn´ı funkce j´adra jako je pr´ace s vl´akny a spr´avce pamˇeti. Dalvik vznikl kv˚ uli hlavnˇe kv˚ uli licenˇcn´ım pr´av˚ um na Java Virtual Machine (JVM), ale tak´e kv˚ uli efektivnˇejˇs´ımu ˇr´ızen´ı spotˇreby a v´ ykonu ˇci optimalizaci poˇzadavk˚ u na pamˇet. Vˇsechna tato krit´eria hraj´ı kl´ıˇcovou u ´lohu u vˇsech mobiln´ıch zaˇrizen´ı. Zjednoduˇsenˇe ˇreˇceno kaˇzd´a aplikace spuˇstˇen´a na Androidu m´a tak´e sv˚ uj vlastn´ı proces a ten bˇeˇz´ı ve sv´em DVM. Vrstva Application framework je nejd˚ uleˇzitˇejˇs´ı vrstvou pro v´ yvoj´aˇre. Zpˇr´ıstupˇ nuje totiˇz v´ yvoj´aˇri napˇr´ıklad dostupn´e sluˇzby i prvky uˇzivatelk´eho rozhran´ı. Nejv´ yˇse je vrstva z´akladn´ıch aplikac´ı, kterou vyuˇz´ıvaj´ı bˇeˇzn´ı uˇzivatel´e operaˇcn´ıho syst´emu tj. jedn´a se o aplikace dodan´e v´ yrobcem mobiln´ıho zaˇr´ızen´ı nebo pozdˇeji nainstalovan´e bal´ıˇcky z ofici´aln´ıho Obchodu Play (dˇr´ıve zn´am´eho jako Android Market) ˇci z jin´ ych zdroj˚ u. Pˇrikladem aplikace z jin´eho zdroje je i moje aplikace Klient Stagu pro Android. Pˇri popisu architektury operaˇcn´ıho syst´emu Android jsem vych´azel z informac´ı na str´ank´ach Wikipedie [8]. 12
3.2.
Vyuˇ zit´ı Androidu
Android byl p˚ uvodnˇe urˇcen´ y pro chytr´e telefony. Nicm´enˇe s pˇr´ıchodem nov´ ych mobiln´ıch zaˇr´ızen´ı se jeho pouˇzit´ı rozˇs´ıˇrilo i na tablety. Nˇekteˇr´ı v´ yrobci hardwaru jej tak´e zaˇcali dod´avat do cenovˇe dostupn´ ych pˇrenosn´ ych poˇc´ıtaˇc˚ u, protoˇze je pro uˇzivatele zdarma, coˇz sniˇzuje cenu tˇechto zaˇr´ızen´ı a z´aroveˇ n napom´ah´a dalˇs´ımu rozˇs´ıˇren´ı operaˇcn´ıho syst´emu Android mezi beˇzn´e uˇzivatele. S popularitou Androidu se tak´e zaˇcalo rozˇsiˇrovat portfolio produkt˚ u, kter´e jsou na trhu dostupn´e, s t´ımto operaˇcn´ım syst´emem. Android se zaˇc´ın´a dost´avat do televizn´ıch pˇrij´ımaˇc˚ u, hern´ıch konzol´ı a pˇr´ıˇst´ı rok by se mˇel zaˇc´ıt uplatˇ novat tak´e v automobilech m´ısto zastaral´ ych a velmi drah´ ych navigaˇcn´ıch syst´em˚ u.
3.3.
Pˇ rehled verz´ı
Tabulka zobrazuje pˇrehled kl´ıˇcov´ ych verz´ı Androidu s jejich k´odov´ ymi ´ oznaˇcen´ımi, u ´rovnˇe API, data vyd´an´ı a pod´ıl dan´e verze na trhu. Udaje o pod´ılu jednotliv´ ych verz´ı na trhu jsou ke dni 5. bˇrezna 2012 (zdroj: http://developer.android.com[4]). Z tabulky je zˇrejm´e, ˇze nejrozˇs´ıˇrenˇejˇs´ı verz´ı na trhu je verze 2.3.x s k´odov´ ym oznaˇcen´ım Gingerbread, kter´a m´a 62% pod´ıl na trhu. S pˇrihl´ednut´ım k tomuto faktu, jsem svou aplikaci vytvoˇril pro tuto nejpoˇcetnˇejˇs´ı skupinu zaˇr´ızen´ı a tak´e proto, ˇze takov´e zaˇr´ızen´ı vlastn´ım a proto vˇse mohu ˇra´dnˇe vyzkouˇset. Do verze 2.3.x byl operaˇcn´ı syst´em Android optimalizov´an pouze pro chytr´e telefony, ale protoˇze se na trhu velmi rozˇs´ıˇril nov´ y druh mobiln´ıho zaˇr´ızen´ı - tablet, tak pˇriˇsla firma Google na trh s verz´ı 3.x.x s k´odov´ ym oznaˇcen´ım Honeycomb, kde byla pˇrid´ana optimalizace pro tablety a dalˇs´ı zaˇr´ızen´ı s velkou obrazovkou. Protoˇze je verze Honeycomb urˇcen´a pro tablety, tak se s n´ı t´emˇeˇr na chytr´ ych telefonech nesetk´ate. Nejnovˇejˇs´ı chytr´e telefony pouˇz´ıvaj´ı aˇz verzi 4.0.x s k´odov´ ym oznaˇcen´ım Ice Cream Sandwich. Verze
K´ odov´ e API Pod´ıl Datum oznaˇ cen´ı u ´ roveˇ n na trhu vyd´ an´ı Android 4.0.X Ice Cream Sandwich 14-15 1,6% 19.10.2011 Android 3.X.X Honeycomb 11-13 3,3% 22.2.2011 Android 2.3.X Gingerbread 9-10 62,0% 6.12.2010 Android 2.2.X Froyo 8 25,3% 20.5.2010 Android 2.1 Eclair 7 6,6% 26.10.2009 Android 1.6 Donut 4 0,8% 15.9.2009 Android 1.5 Cupcake 3 0,4% 30.4.2009 Tabulka 1. Pˇrehled kl´ıˇcov´ ych verz´ı Androidu
13
4.
V´ yvoj aplikac´ı pro platformu Android
Kapitola obsahuje popis vybran´ ych a pouˇzit´ ych stavebn´ıch prvk˚ u pouˇz´ıvan´ ych pˇri tvorbˇe aplikace Klient Stagu pro Android.
4.1.
Jak zaˇ c´ıt programovat
Nejv´ıce mˇe v zaˇc´atc´ıch pomohla kniha Android 2 - Pr˚ uvodce programov´an´ım mobiln´ıch aplikac´ı od Marka L. Murphy [1], kter´a je psan´a pro zaˇca´teˇcn´ıky se z´akladn´ı znalost´ı Javy. Javu jsem se uˇcil pˇrev´aˇznˇe z knihy Sharona Zakhoura a u Javy a Androidu se pro mˇe stal nejvˇetˇs´ım kolektivu[2]. Po zvl´adnut´ı z´aklad˚ zdrojem informac´ı web pro v´ yvoj´aˇre [4], kter´ y spravuje pˇr´ımo firma Google. Str´anky pro v´ yvoj´aˇre od Googlu jsou jako referenˇcn´ı pˇr´ıruˇcka, a proto je doporuˇcuji pouˇz´ıvat. Z praktick´eho hlediska je uˇziteˇcn´ y seri´al Vyv´ıj´ıme pro Android [3], kter´ y je skvˇel´ ym u ´vodem do n´azvoslov´ı a jsou zde i pˇr´ıklady praktick´ ych a pouˇz´ıvan´ ych k´od˚ u. 4.1.1.
Bez ˇ ceho se neobejdete
Neobejte se bez znalost´ı jazyka Java (nemus´ı b´ yt pˇr´ıliˇs hlubok´a), znalosti XML, znalosti prostˇred´ı Androidu a problematiky tvorby a stuktury projekt˚ u pro operaˇcn´ı syst´em Android. Ze softwarov´e v´ ybavy budete d´ale budete potˇrebovat: • nainstalovat Java SE Development Kit 7 ze str´anek firmy Oracle • Android SDK Tools, kter´ y je ke staˇzen´ı na http://developer.android.com/sdk/. Tento bal´ık obsahuje vˇse potˇrebn´e, co se t´ yka Androidu. Najdete v nˇem Android SDK Manager slouˇz´ıc´ı pro spr´avu bal´ıˇck˚ u, kter´ ym si m˚ uˇzete st´ahnout knihovny t´e verze Androida pro kterou bude aplikaci vyv´ıjet. Jeˇstˇe v Android SDK Tools naleznete AVD Manager (Android Virtual Device Manager). AVD Manager umoˇzn ˇuje spr´avu vaˇsich virtu´aln´ıch zaˇr´ızen´ı, na kter´ ych budete v emul´atoru zkouˇset svoje aplikace. • m´ıt alespoˇ n textov´ y editor, v kter´em budete ps´at zdrojov´e k´ody. Pokud se tedy nerozhodnete pro nˇekter´e z moˇzn´ ych v´ yvojov´ ych prostˇred´ı v kapitole 4.1.2. To, co jsem pr´avˇe vyjmenoval je u ´pln´e minimum, nutn´e k tomu, abyste se mohli pustit do sv´e prvn´ı aplikace.
14
4.1.2.
Pˇ rehled moˇ zn´ ych v´ yvojov´ ych prostˇ red´ı
D´ıky v´ yvojov´emu prostˇred´ı bude vaˇse programov´an´ı mnohem efektivnˇejˇs´ı a bude obsahovat m´enˇe chyb, protoˇze v prostˇred´ı editoru je obsaˇzena pr˚ ubˇeˇzn´a syntaktick´a kontrola k´odu, r˚ uzn´e n´apovˇedy n´azv˚ u metod, automatick´e ˇci poloautomatick´e ”dokonˇcovaˇce”a mnoho dalˇs´ıho. V pˇr´ıpadˇe, ˇze se tedy rozhodnete vyuˇz´ıt komfortu v´ yvojov´eho prostˇred´ı, coˇz vˇrele doporuˇcuji - obzvl´aˇstˇe pokud s Androidem zaˇc´ın´ate, tak m´ate na v´ ybˇer nˇekolik moˇznost´ı. Jak jsem v pˇredchoz´ı kapitole 4.1.1. tvrdil, ˇze je nutn´a znalost jazyka Java, tak to nen´ı aˇz tak u ´plnˇe pravda a je tady jeˇstˇe jedna moˇznost - a to pokud um´ıte programovat v C#. Pokud se chcete vydat touto cestou, pak v´am staˇc´ı m´ıt nainstlalov´an .NET a Visual Studio 2010 a do nˇej si nainstalovat add-on MonoDroid. MonoDroid nelze provozovat s Visual Studiem Express. Jak MonoDroid zprovoznit a zaˇc´ıt s n´ım programovat aplikace pro Android pˇeknˇe popsal Mahesh Chand ve sv´em ˇcl´anku Building Android Applications using C#. Protoˇze drtiv´a vˇetˇsina v´ yvoj´aˇr˚ u si zvolila programovat aplikace pro Android v jazyce Java, zvolil jsem tuto cestu i j´a. Dalˇs´ım z´asadn´ım d˚ uvodem proˇc programovat v jazyce Java je fakt, ˇze Java k´od se v Androidu spouˇst´ı ”pˇr´ımo”a v´aˇs k´od nemus´ı proch´azet ”konvertorem”jak´ ym je MonoDroid. Nejpouˇz´ıvanˇejˇs´ım, a z m´eho pohledu i nejpropracovanˇejˇs´ım, v´ yvojov´ ym prostˇred´ım je produkt Eclipse a proto jsem si ho zvolil pro v´ yvoj sv´e aplikace Klient Stagu pro Android. Podrobnˇeji se mu budu vˇenovat v n´asleduj´ıc´ı kapitole 4.1.3. Dalˇs´ı moˇznost´ı je v´ yvojov´e prostˇred´ı Netbeans od firmy Oracle, kter´e je open source. Podporuje v´ıce programovac´ıch jazyk˚ u, ale prim´arnˇe je urˇcen pro v´ yvoj aplikac´ı v jazyce Java. 4.1.3.
V´ yvojov´ e prostˇ red´ı Eclipse
Eclipse je open source v´ yvojov´a platforma, kter´a se zamˇeˇruje na programov´an´ı v jazyce Java. Eclipse m´a moˇznost rozˇsiˇritelnosti pomoc´ı plugin˚ u a to je pr´avˇe jeho silnou str´ankou, protoˇze d´ıky plugin˚ um lze Eclipse rozˇs´ıˇrit tak, aby se v nˇem dalo vyv´ıjet pro platformu Android. Tento plugin se jmenuje ADT Plugin (ADT - Android Development Tools) a lze ho nainstalovat pohodlnˇe pˇr´ımo z prostˇred´ı Eclipse. Nejprve je nutn´e nainstalovat Eclipse, takˇze si jej nejdˇr´ıve ybˇer nˇekolik verz´ı st´ahneme z http://www.eclipse.org/downloads/. Je zde na v´ produktu Eclipse - doporuˇcuji verzi Eclipse Classic. Po staˇzen´ı a naistalov´an´ı produktu Eclipse jej spust’te a nastavte si pracovn´ı adres´aˇr k ˇcemuˇz v´as Eclipse vyzve. Jakmile se dostanete do v´ yvojov´eho prostˇred´ı nainstalujte si ADT Plugin. To udˇel´ate n´asledovnˇe: zvolte v menu Help > Install New Software, v oknˇe stisknˇete tlaˇc´ıtko Add a vyplˇ nte u ´daje dle obr´azku 4. a potvrd’te. V oknˇe Available Software zatrhnˇete Developer Tools, potvrd’te a dokonˇcete instalaci pluginu. Po instalaci ADT Pluginu je nutn´e restartovat Eclipse. T´ımto m´ate prostˇred´ı
15
Obr´azek 4. Pˇrid´an´ı ADT Pluginu Eclipse pˇripraven a m˚ uˇzete se pustit do programov´an´ı pro platformu Android. 4.1.4.
Zaloˇ zen´ı nov´ eho projektu v Eclipse
Zaloˇzen´ı projektu je d´ıky pr˚ uvodci jednoduch´e a rychl´e narozd´ıl od ruˇcn´ıho vytv´aˇren´ı vˇsech potˇrebn´ ych soubor˚ u a adres´aˇr˚ u. Nov´ y projekt vytvoˇr´ıme takto: zvol´ıme v menu poloˇzku File > New > Project, v oknˇe si nalistujem sekci Android a tam zvol´ıme Android Application Project. V dalˇs´ım kroku mus´ıme vyplnit n´azev aplikace, jm´eno projektu a jm´eno bal´ıˇcku se n´am pˇredvypln´ı automaticky, ale lze je, v pˇr´ıpadˇe potˇreby, zmˇenit. Potvrd´ıme a v n´asleduj´ıc´ım kroku si m˚ uˇzeme zvolit ikonu naˇs´ı aplikace, pod kterou ji najdeme v seznamu program˚ u. Dalˇs´ı kroky m˚ uˇzeme potvrdit a zanechat implicitn´ı hodnoty. T´ımto jsme vytvoˇrili z´akladn´ı adres´aˇrovou strukturu naˇs´ı nov´e aplikace vˇcetnˇe vˇsech potˇrebn´ ych soubor˚ u, v´ ysledek je vidˇet na obr´azku 5. 4.1.5.
Popis adres´ aˇ rov´ e struktury Android projektu
Kaˇzd´ y projekt obsahuje pevnˇe danou strukturu adres´aˇr˚ u a soubor˚ u. Tu je vidˇet na obr´azku 5. Postupnˇe si ji pˇredstav´ıme po jednotliv´ ych adres´aˇr´ıch od koˇrenov´eho adres´aˇre: • AndroidManifest.xml: XML dokument popisuj´ıc´ı naˇsi aplikaci a jej´ı komponenty (vˇsechny Activity, pr´ava aplikace - permissions, sluˇzby atp.) • /src/: v tomto adres´aˇri jsou uloˇzeny vˇsechny zdrojov´e soubory (*.java) naˇsich Activity, vlastn´ıch tˇr´ıd atd. Pˇr´ıklad takov´ehoto souboru je v kapitole 4.3.1. • /gen/: sem si pˇrekladaˇce ukl´adaj´ı zdrojov´ y k´od, kter´ y vygeneruj´ı • /assets/: adres´aˇr pro statick´e soubory, kter´e chceme pˇribalit k aplikaci urˇcen´e k pouˇzit´ı na zaˇr´ızen´ı • /bin/: adres´aˇr, kde se aplikace uchov´av´a po jej´ım zkompilov´an´ı
16
• /libs/: zde se ukl´adaj´ı knihovny (napˇr. tˇret´ıch stran), kter´e naˇse aplikace potˇrebuje • /res/: toto je nejpouˇz´ıvanˇejˇs´ı adres´aˇr spoleˇcnˇe z adres´aˇrem src. Jsou zde vˇsechny potˇrebn´e prostˇredky jako jsou ikony, soubory s n´avrhem grafick´eho uˇzivatelsk´eho rozhran´ı - layouty, n´avrhy menu, seznamy ˇretˇezc˚ u atd.
Obr´azek 5. Adres´aˇrov´a struktura projektu Pojd’me se nyn´ı podrobnˇeji pod´ıvat do obsahu adres´aˇre /res/: • /res/layout: zde jsou XML soubory s n´avrhy grafick´eho uˇzivatelsk´eho rozhran´ı (GUI) • /res/menu: opˇet m´ısto pro XML soubory, ale tentokr´at se specifikac´ı menu • /res/values: zde jsou XML soubory s ˇretˇezci, poli apod. • /res/drawable: adres´aˇr pro obr´azky PNG, JPG atp. • /res/xml: adres´aˇr s dalˇs´ımi XML soubory, kter´e chceme k aplikaci pˇribalit • /res/raw: urˇceno pro r˚ uzn´e typy soubor˚ u Pˇri odkazov´an´ı se na prostˇredky (resources), z adres´aˇre /res/, v programov´em k´odu pouˇz´ıv´ame tento syst´em (n´azvy soubor˚ u se uv´ad´ı bez pˇr´ıpony): • /res/layout: R.layout.nazevsouboru • /res/menu: R.menu.nazevsouboru 17
• /res/values: R.nazevsouboru.nazevhodnotyvsouboru • /res/drawable: R.drawable.nazevsouboru • /res/xml: R.xml.nazevsouboru • /res/raw: R.raw.nazevsouboru Pˇri odkazov´an´ı se na prostˇredky (resources), z adres´aˇre /res/, v XML layoutech pouˇz´ıv´ame tento syst´em (n´azvy soubor˚ u se uv´ad´ı bez pˇr´ıpony): • /res/values: @nazevsouboru/nazevhodnotyvsouboru napˇr´ıklad @string/btnWizardText n´as odkazuje do adres´aˇre /res/values na soubor string.xml (jedn´a se o soubor s ˇretˇezci - vhodn´e pro multilingu´aln´ı programy) a hodnotu ˇretˇezce btnWizardText • /res/drawable: @drawable/nazevsouboru
4.2.
Moˇ zn´ e pˇ r´ıstupy k programov´ an´ı GUI
V´ yvoj´aˇr se m˚ uˇze postavit, k programov´an´ı GUI pro platformu Android, dvˇema r˚ uzn´ ymi zp˚ usoby. Prvn´ım z nich je programov´e ˇreˇsen´ı a druh´e deklarativn´ı. Porovn´an´ı obou zp˚ usob˚ u demonstruji na tvorbˇe stejn´eho prvku GUI a to na menu. Vizu´aln´ı v´ ysledek programov´eho i deklarativn´ıho zp˚ usobu ˇreˇsen´ı je stejn´ y a je j´ım menu na obr´azku 13. 4.2.1.
Programov´ y zp˚ usob tvorby GUI
Tento zp˚ usob spoˇc´ıv´a v tom, ˇze cel´a tvorba menu je pouze v programov´em k´odu naˇs´ı Activity. Menu tedy generujeme pˇr´ımo k´odem, kter´ y uvedeme v metodˇe onCreateOptionsMenu. V´ yhodou tohoto ˇreˇsen´ı je na prvn´ı pohled menˇs´ı mnoˇzstv´ı k´odu, kter´e je nav´ıc pˇeknˇe pohromadˇe v naˇs´ı Activity. Nev´ yhodou tototo zp˚ usobu tvorby GUI je fakt, ˇze v k´odu Activity m´ame dohromady jak funkˇcn´ı k´od, tak definici grafiky. Z toho plyne, ˇze pˇr´ıpadn´e zmˇeny (napˇr´ıklad poˇrad´ı poloˇzek v menu) mus´ıme ˇreˇsit z´asahem v k´odu Activity. K´od nutn´ y pro vytvoˇren´ı menu pomoc´ı programov´eho ˇreˇsen´ı (um´ıstˇen´ y v naˇs´ı Activity): @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0,OPTIONS_ID,0,R.string.menu_options) .setIcon(android.R.drawable.ic_menu_preferences); menu.add(0,HELP_ID,0,R.string.menu_help) 18
.setIcon(android.R.drawable.ic_menu_help); menu.add(0,EXIT_ID,0,R.string.menu_exit) .setIcon(android.R.drawable.ic_menu_close_clear_cancel); menu.add(0,ABOUT_ID,0,R.string.menu_about) .setIcon(android.R.drawable.ic_menu_info_details); return true; } Dalˇs´ı, nikoliv z´asadn´ı, nev´ yhodou programov´eho ˇreˇsen´ı je jin´ y zp˚ usob identifikace jednotliv´ ych prvk˚ u. Prvky jsou identifikov´any ˇc´ısly, kter´e si mus´ıme definovat. Napˇr´ıklad OPTIONS ID=0, HELP ID=1 atd. Na toto je nutn´e mystet pˇri obsluze ud´alosti onOptionsItemSelected. U deklarativn´ıho zp˚ usobu se pˇri obsluze t´eto ud´alosti odvol´av´ame na pˇr´ıstuˇsn´e id, kter´e jsme si v XML souboru definovali (parametr android:id). V´ yhodou programov´eho ˇreˇsen´ı je, ˇze s n´ım m˚ uˇzeme ˇreˇsit i situace, kter´e deklarativn´ım zp˚ usobem v˚ ubec vytvoˇrit nelze. V´ıce se o t´eto v´ yhodˇe zmiˇ nuji v kapitole 4.2.2. 4.2.2.
Deklarativn´ı ˇ reˇ sen´ı tvorby GUI
Toto ˇreˇsen´ı je zaloˇzeno na souˇcinnosti programov´eho k´odu Activity a XML soubor˚ u. Odstraˇ nuje nˇekter´e z nedostatk˚ u programov´eho zp˚ usobu tvorby GUI. T´ım nejz´asadnˇejˇs´ım je fyzick´e oddˇelen´ı definice grafiky a funkˇcn´ıho k´odu do dvou r˚ uzn´ ych soubor˚ u. Z hlediska praktick´eho je deklarativn´ı ˇreˇsen´ı v´ yhodnˇejˇs´ı, i kdyˇz je pro v´ yvoj´aˇre o trochu pracnˇejˇs´ı. Tento zp˚ usob programov´an´ı jsem si zvolil i j´a, a proto jej uvid´ıte i v m´ ych vzorov´ ych k´odech v t´eto pr´aci. K´od um´ıstˇen´ y v naˇs´ı Activity pro vytvoˇren´ı menu pomoc´ı deklarativn´ıho ˇreˇsen´ı: @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; } Jak je vidˇet, v k´odu se pouze ”odkazujeme”na soubor main menu.xml s grafick´ ym n´avrhem menu (R.menu.main menu = /res/menu/main menu.xml). K´od pˇr´ısluˇsn´eho XML souboru main menu.xml um´ıstˇen´eho v adres´aˇri /res/menu: <menu xmlns:android="http://schemas.android.com/apk/res/android" > 19
Nev´ yhodou tohoto zp˚ usobu tvorby GUI je, ˇze ho nelze pouˇz´ıt na takov´a zobrazen´ı, kdy pˇresnˇe nezn´ame poˇcet a um´ıstˇen´ı prvk˚ u. Pˇr´ıkladem z m´e aplikace Klient Stagu pro Android je Rozvrh hodin (obr´azek 6.) - zde dopˇredu nev´ıme kolik pˇredmˇet˚ u m´a dan´ y student v rozvrhu, jak jsou dlouh´e ani den v t´ ydnu kaˇzd´eho pˇredmˇetu. Nicm´enˇe to lze ˇreˇsit kompromisem, kdy jako z´aklad pouˇzijeme deklaraˇcn´ı zp˚ usob a pˇredmˇety generujeme programovˇe.
Obr´azek 6. Rozvrh hodin
4.3.
Z´ akladn´ı stavebn´ı kameny 20
4.3.1.
Activity
Activity je hlavn´ı ˇca´st kaˇzd´e aplikace, bez n´ı nelze ˇza´dnou aplikaci spustit. Activity si m˚ uˇzeme pˇredstavit jako mal´ıˇrsk´e pl´atno nebo jednu obrazovku naˇs´ı aplikace. Activity m˚ uˇze obsahovat tˇreba jen funkˇcn´ı k´od a nebo obsahuje i ovl´adac´ı prvky jako jsou tlaˇc´ıtka, pˇrep´ınaˇce, textov´a pole a dalˇs´ı. Activity jsou ukl´ad´any v r´amci projektu do podadres´aˇre src, kde je kaˇzd´a Activity uloˇzen´a ve sv´em souboru napˇr´ıklad UkazkaActivity.java. Nejjednoduˇsˇs´ı k´od Activity by mohl b´ yt napˇr´ıklad tento: package com.example.android.mojeaplikace; import android.app.Activity; import android.os.Bundle; public class UkazkaActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Prvn´ı sekce package je jm´eno bal´ıku coˇz je vlastnˇe jm´eno naˇs´ı aplikace - v naˇsem pˇr´ıpadˇe mojeaplikace. V druh´e ˇcasti import se vkl´adaj´ı potˇrebn´e knihovny, kter´e v r´amci naˇs´ı Aktivity budeme pouˇz´ıvat. A v posledn´ı tˇret´ı ˇca´sti je definice tˇr´ıdy UkazkaActivity, kter´a je potomkem tˇr´ıdy android.app.Activity jenˇz importujeme v pˇredchoz´ım bloku. Z toho vypl´ıv´a, ˇze kaˇzd´a naˇse Activity je potomkem zmiˇ novan´e tˇr´ıdy android.app.Activity. Uvnitˇr naˇs´ı tˇr´ıdy definujeme metody, kde jedna z tˇech z´akladn´ıch je metoda onCreate, kter´a se vol´a ihned po vytvoˇren´ı UkazkaActivity. V onCreate je d˚ uleˇzit´e zavolat metodu super.onCreate(savedInstanceState), kterou je vhodn´e volat co nejdˇr´ıve. N´asleduj´ıc´ı metoda setContentView(R.layout.main) n´am spojuje naˇsi UkazkaActivity s XML souborem layoutu. Layout soubor naˇseho konkr´etn´ıho pˇr´ıkladu se jmenuje main.xml a najdete ho ve vaˇsem projektu v adres´aˇri /res/layout. Aby UkazkaActivity nˇeco dˇelala, je nutn´e do zmiˇ novan´eho souboru main.xml vloˇzit napˇr´ıklad takov´ yto k´od:
21
V XML souboru definujeme jen prvky grafick´eho uˇzivatelsk´eho prostˇred´ı (GUI), takˇze jsou oddˇeleny programov´a ˇca´st a GUI. V naˇsem pˇr´ıkladu je definov´an jen jeden prvek TextView, kter´ y zobrazuje text uveden´ y v parametru android:text. Posledn´ı, co mus´ıme definovat, je soubor AndroidManifest.xml. V nˇem mus´ı b´ yt zapsan´e vˇsechny Activity a u jedn´e z nich mus´ı b´ yt uveden element intent-filter. Pˇr´ıklad jednoduch´eho souboru AndroidManifest.xml s jednou Activity UkazkaActivity: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.mojeaplikace" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" />
Vˇsechny tyto tˇri soubory tvoˇr´ı, samozˇrejmˇe po zkompilov´an´ı, aplikaci pro operaˇcn´ı syst´em Android, kter´a po spuˇstˇen´ı zobraz´ı v lev´em horn´ım rohu text Ahoj svˇete!. Spuˇstˇenou aplikaci ilustruje obr´azek 7.
22
Obr´azek 7. Obrazovka ukazkov´e Activity 4.3.2.
Widget
Android nab´ız´ı sadu prvk˚ u grafick´eho uˇzivatelsk´eho rozhran´ı (GUI), obdobnˇe jako je tomu napˇr´ıklad na platformˇe Windows, kter´a obsahuje z´akladn´ı Widgety. Jsou to napˇr´ıklad tyto prvky (nejedn´a se o kompletn´ı seznam, ale v´ ybˇer nejpouˇz´ıvanˇejˇs´ıch prvk˚ u): • TextView (popisek) - na obrazovce aplikace zobraz´ı popisn´ y text. Tento prvek je vidˇet na obr´azku 7. a je reprezentov´an textem Ahoj svˇete! • Button (tlaˇc´ıtko) - tento prvek vytvoˇr´ı bˇeˇzn´e tlaˇc´ıtko, kter´e bez potˇrebn´eho k´odu ve vaˇs´ı Activity nebude nic spouˇstˇet. • ImageView (obr´azek) - jedn´a se o analogii prvku TextView, ale v´ ysledkem je obr´azek • ImageButton (obr´azkov´e tlaˇc´ıtko) - opˇet se jedn´a o analogii prvku Button, jen s t´ım rozd´ılem, ˇze je na tlaˇc´ıtku um´ıstˇen´ y obr´azek • EditText (textov´a pole) - pomoc´ı textov´ ych pol´ı m˚ uˇzeme aplikaci zad´avat jak´ ykoliv text. Na obr´azku 8. je napˇr´ıklad pouˇzit v Activity pro vyhled´av´an´ı student˚ u. • CheckBox (zatrˇz´ıtka) - bˇeˇznˇe zn´am´e zaˇskrt´avac´ı pol´ıˇcko pouˇz´ıvan´e pro volby ano/ne, zapnuto/vypnuto atp. Pˇr´ıkladem je poloˇzka Pr˚ uvodce nastaven´ım po spuˇstˇen´ı na obr´azku 16. • RadioButton (kulat´e pˇrep´ınaˇce) - jedn´a se o prvky, kter´ ymi se vyb´ır´a z nˇekolika voleb pr´avˇe jedna volba (viz obr´azek 9.). V XML souboru se sdruˇzuj´ı pomoc´ı elementu RadioGroup.
23
Obr´azek 8. Uk´azka widgetu EditText a Button 4.3.3.
Obr´azek 9. Uk´azka widgetu RadioButton
Intent
Intent (z´amˇer) je instance tˇr´ıdy android.content.Intent a jedn´a se vlastnˇe o asynchonn´ı zpr´avy, kter´e umoˇzn ˇuj´ı poˇzadovat jedn´e komponentˇe syst´emu Android funkci od jin´e komponenty syst´emu Android. Typick´ ym pˇr´ıkladem z´amˇeru je zaslan´ı zpr´avy, aby syst´em Android spustil nˇejakou dalˇs´ı Activity. Pˇr´ıklad z´amˇeru - spuˇstˇen´ı Activity s n´azvem Help.class, kter´a m˚ uˇze b´ yt um´ıstˇena napˇr´ıklad v metodˇe onClick nˇejak´eho tlaˇc´ıtka v aplikaci: startActivity(new Intent(this, Help.class)); Dalˇs´ım pˇr´ıkladem vyuˇzit´ı z´amˇeru je napˇr´ıklad pˇrid´an´ı poloˇzky do kalend´aˇre. Takov´ y k´od by vypadal takto: Intent intent = new Intent(Intent.ACTION_EDIT); intent.setType("vnd.android.cursor.item/event"); intent.putExtra("beginTime", cal.getTimeInMillis()); intent.putExtra("allDay", true); intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); intent.putExtra("title", fullObject.getTxtBig().toString()); intent.putExtra("eventLocation", location); startActivity(intent); 24
Z´amˇer m˚ uˇze tak´e obsahovat data napˇr´ıklad pˇri vol´an´ı komponenty internetov´eho prohl´ıˇzeˇce je souˇca´st´ı z´amˇeru tak´e URL, kter´e m´a prohl´ıˇzeˇc zobrazit. Nebo m˚ uˇzeme pˇred´avat pomoc´ı z´amˇeru parametry z jedn´e Activity do druh´e - toto demonstruji na n´asleduj´ıc´ım k´odu: i = new Intent(HlavniMenuActivity.this, DepartmentInfo.class); i.putExtra("requestCode", 0); startActivityForResult(i,0); Tento k´od spust´ı z Activity HlavniMenuActivity dalˇs´ı Activity DepartmentInfo a pˇred´av´a j´ı parametr requestCode. 4.3.4.
ListView
ListView je skupinov´e zobrazen´ı poloˇzek, kter´e lze rolovat (scrollovat). Pouˇz´ıv´a se pˇredevˇs´ım pro r˚ uzn´e v´ ypisy seznam˚ u poloˇzek. Jde o jeden z nejpouˇz´ıvanˇejˇs´ıch prvk˚ u v aplikac´ıch na platformˇe Android. ListView m˚ uˇze zobrauˇze zobrazovat i sloˇzitˇejˇs´ı zovat jednoduch´ y seznam (viz obr´azek 10.), nicm´enˇe m˚ datov´e struktury (nˇekolik poloˇzek v jednom bloku) jako je na obr´azku 11. - zobrazuje skupinu pˇeti u ´daj˚ u a jedn´e pozn´amky, kter´a je pˇr´ıtomna jen u nˇekter´e ze skupin.
Obr´azek 10. Uk´azka jednoduch´eho seznamu ListView
25
Obr´azek 11. Uk´azka komplexn´ıho seznamu ListView
Jednotliv´e poloˇzky jsou automaticky vkl´ad´any do seznamu d´ıky objektu Adapter, kter´ y bere data z urˇcen´eho zdroje (pole, datab´aze) a konvertuje je do odpov´ıdaj´ıc´ıho zobrazen´ı. V pˇripadˇe jednoduch´eho seznamu je vhodn´e vyuˇz´ıt toho, ˇze ListView je potomkem tˇr´ıdy ListActivity a pak nen´ı nutn´e si programovat vlastn´ı Adapter. U sloˇzitˇejˇs´ıch seznam˚ u poloˇzek, jako je jiˇz zm´ınˇen´ y ListView na obr´azku 11., je nutn´e si napsat vlastn´ı Adapter. Toto budu bl´ıˇze popisovat v n´asleduj´ıc´ı kapitole Adapter. Pˇr´ıklad jednoduch´eho ListActivity: import import import import
android.app.Activity; android.os.Bundle; android.widget.ArrayAdapter; android.widget.ListView;
public class VyberFakultuActivity extends ListActivity { ArrayList<String> facultiesList = new ArrayList<String>(); public void onCreate(Bundle icicle) { super.onCreate(icicle); ... //naplnˇ en´ ı seznamu facultiesList this.setListAdapter(new ArrayAdapter<String> (this,android.R.layout.simple_list_item_1, facultiesList.toArray(new String[0]))); } . . } Tento jednoduch´ y seznam poloˇzek dokonce ani nevyˇzaduje pˇr´ısluˇsn´ y XML soubor s layoutem narozd´ıl od sloˇzitˇejˇs´ıch seznam˚ u, kde je nutn´e kromˇe naprogramov´an´ı Adapter u jeˇstˇe vytvoˇrit 2 soubory s XML layoutem: jedn´e skupiny poloˇzek v seznamu (jeden ”ˇr´adek”seznamu) a pak celkov´ y layout seznamu. 4.3.5.
Adapter
Adapter se pouˇz´ıv´a pˇri tvorbˇe komplexn´ıch ListView seznam˚ u a jeho rol´ı je, ˇze ”sed´ı”mezi naˇsim zdrojem dat a naˇs´ı obrazovkou. Pˇr´ıkladem takov´eho seznamu je napˇr´ıklad seznam zkouˇskov´ ych term´ın˚ u na obr´azku 11., kterou pouˇziji jako demonstraˇcn´ı. Schematicky je role adapt´eru zn´aroznˇena na obr´azku 12. Ve sv´e Activity ExamList v metodˇe onCreate definujeme pomoc´ı setContentView pˇr´ısluˇsn´ y XML layout (exam list - leˇz´ıc´ı v adres´aˇri /res/layout). Jeho k´od je jednoduch´ y a obsahuje pouze jeden objekt a t´ım je pr´avˇe ListView. K´od souboru exam list.xml: 26
Obr´azek 12. Blokov´e sch´ema Adapteru
Zmiˇ novan´ y objekt ListView je v XML souboru pojmenov´an parametrem android:id n´azvem examListView, kter´e mus´ıme v metodˇe onCreate takt´eˇz definovat, aby bylo moˇzn´e nastavit adapt´er. Tato definice je vidˇet na n´asleduj´ıc´ım k´odu v druh´em ˇra´dku (tento k´od je um´ıstˇen v onCreate metodˇe naˇs´ı Activity). setContentView(R.layout.exam_list); final ListView lv = (ListView) findViewById(R.id.examListView); lv.setAdapter(new ExamListBaseAdapter(ExamList.this, itemsList)); Tˇret´ım ˇr´adkem nastavujeme naˇsemu zobrazen´ı examListView, definovan´em v souboru exam list.xml, sv˚ uj adapt´er s n´azvem ExamListBaseAdapter. Argumenty naˇseho adapt´eru jsou ExamList.this (n´azev naˇs´ı Activity) a ArrayList zkouˇskov´ ych term´ın˚ u - itemsList. Jeˇstˇe neˇz se pod´ıv´ame na k´od naˇseho adapt´eru (ExamListBaseAdapter ), uk´aˇzi XML k´od layout souboru exam list row.xml, kter´ y definuje, jak m´a vypadat ˇra´dek naˇseho seznamu. K´od souboru exam list row.xml, leˇz´ıc´ıho adres´aˇri /res/layout:
android:layout_height="match_parent" android:padding="5dp" >
android:layout_below="@+id/location" android:layout_marginTop="5dp" android:background="@color/white" android:textColor="@android:color/black" /> Kompletn´ı zdrojov´ y k´od vlastn´ıho adapt´eru najdete v pˇr´ıloze A.. V definici tˇr´ıdy adapt´eru, kter´a je potomkem tˇr´ıdy BaseAdapter, je definov´ano spojen´ı s vlastn´ım zdrojem dat - ArrayList objekt˚ u Exam, kter´ y jsem pojmenoval examArrayList. N´asleduj´ı metody potˇrebn´e pro spr´avnou funkci adapt´eru, pak metoda getView staraj´ıc´ı se o prov´az´an´ı datov´e poloˇzky s vizu´aln´ım prvkem v souboru exam list row.xml - toto m´a za u ´kol tento pˇr´ıkaz: convertView = mInflater.inflate(R.layout.exam_list_row, null); Ned´ılnou souˇca´st´ı adapt´eru je statick´a tˇr´ıda ViewHolder, pˇres kterou k tomuto propojen´ı doch´az´ı.
4.4. 4.4.1.
Dalˇ s´ı prvky pouˇ zit´ e v projektu Menu
Menu se otv´ır´a stiskem hardwarov´eho tlaˇc´ıtka Menu na mobiln´ım zaˇr´ızen´ı. V syst´emu Android je naz´ yvano jako Menu voleb nebo tak´e Option menu a jedn´a se o nab´ıdku vyj´ıˇzdˇej´ıc´ı ze spodu obrazovky tak, jak je zobrazeno na obr´azku 13.. Menu m˚ uˇze m´ıt 1 aˇz 6 poloˇzek, kter´a jsou pˇr´ımo viditeln´a. V pˇr´ıpadˇe, ˇze menu obsahuje v´ıce neˇz 6 poloˇzek, pak se v menu objev´ı nov´a volba Dalˇs´ı, kter´a zpˇr´ıstupn´ı zb´ yvaj´ıc´ı poloˇzky. Nejjednoduˇsˇs´ı zp˚ usob jak vytvoˇrit takov´eto menu je pomoc´ı XML layoutu, kter´ y se vytv´aˇr´ı v adres´aˇri /res/menu, a pˇr´ısluˇsn´eho k´odu ve vaˇs´ı Activity. Do sv´e Activity vloˇz´ıte novou metodu onCreateOptionsMenu, kde definujete n´azev XML layoutu (main menu), kter´ y chcete pouˇz´ıt jako menu. Pˇr´ısluˇsn´ y k´od vypad´a n´asledovnˇe: @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; } Pro u ´plnost jeˇstˇe potˇrebn´ y k´od XML layoutu v souboru main menu.xml:
29
Obr´azek 13. Menu voleb (ˇcervenˇe vyznaˇceno) <menu xmlns:android="http://schemas.android.com/apk/res/android" >
K v´ yˇse uveden´emu XML layoutu menu bych jeˇstˇe doplnil, ˇze parametrem android:icon definujeme ikonu, kter´a je v tomto pˇr´ıpadˇe syst´emov´a, ale m˚ uˇzeme pouˇz´ıt i svou vlastn´ı nebo menu udˇelat pouze textov´e vynech´an´ım parametru. Menu m˚ uˇzeme udˇelat i jen ˇcistˇe obr´azkov´e, vynech´an´ım parametru android:title Aby bylo menu funkˇcn´ı (”klikateln´e”) je nutn´e ve vaˇs´ı Activity vytvoˇrit obsluˇznou metodu onOptionsItemSelected. Napˇr´ıklad takto: @Override 30
public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.options: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); global.stagservices = prefs.getString(KEY_UNIVERSITY, ""); global.faculty = prefs.getString(KEY_FACULTY, ""); global.department = prefs.getString(KEY_DEPARTMENT, ""); startActivity(new Intent(this, EditPreferences.class)); return true; case R.id.exit: finish(); return true; case R.id.help: startActivity(new Intent(this, Help.class)); return true; case R.id.info: ... return true; default: return super.onOptionsItemSelected(item); } } Toto samozˇrejmˇe nen´ı jedin´ y moˇzn´ y zp˚ usob jak vytvoˇrit menu, ale je podle m´eho n´azoru nejpˇrehlednˇejˇs´ı. Podrobnˇeji se porovn´an´ı dvou r˚ uzn´ ych pˇr´ıstup˚ u k programovan´ı GUI vˇenuji v kapitole 4.2. 4.4.2.
GridView
GridView umoˇzn ˇuje dvou-dimenzion´aln´ı zobrazen´ı poloˇzek v rolovateln´e mˇr´ıˇzce. Poloˇzky mˇr´ıˇzky jsou naˇc´ıt´any opˇet prostˇrednictv´ım adapt´eru, kter´ y je ale mnohem jednoduˇsˇs´ı, neˇz tomu bylo u ListView 4.3.4. GridView je nav´ıc tak flexibiln´ı, ˇze umoˇzn ˇuje i automatick´e pˇrepoˇc´ıt´an´ı sloupc˚ u a ˇra´dk˚ u tak, aby pˇri pˇreklopen´ı mobiln´ıho zaˇr´ızen´ı na ˇs´ıˇrku nezobrazoval poˇra´d stejnou mˇriˇzku, ale efektivnˇeji vyuˇzil celou plochu obrazovky. Toto chov´an´ı se definuje v XML layoutu a jedn´a se o parametr android:numColumns="auto fit". Vaˇse Activity by mohla vypadat napˇr´ıklad takto: public class HlavniMenuActivity extends Activity implements AdapterView.OnItemClickListener { String[] items={"Akademick´ y kalend´ aˇ r", "O katedˇ re", "Pˇ redmˇ ety katedry", "Uˇ citel´ e katedry", "Vyhled´ av´ an´ ı student˚ u", "Vyhled´ av´ an´ ı uˇ citel˚ u", "Moje zk. term´ ıny", "M˚ uj rozvrh", "Moje pˇ redmˇ ety", "O mnˇ e", 31
Obr´azek 14. Uk´azka dvou-dimezion´aln´ıho zobrazen´ı mˇr´ıˇzkou - GridView "Rozvrh uˇ citele", "Pˇ redmˇ ety uˇ citele"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_grid); GridView g=(GridView) findViewById(R.id.grid); g.setAdapter(new GridViewAdapter(this, android.R.layout.simple_list_item_1, items)); g.setOnItemClickListener(this); } } Vˇsimnˇete si v definici tˇr´ıdy vaˇs´ı Activity je implements AdapterView.OnItemClickListener, kter´e u jin´ ych Activity neb´ yv´a. Toto n´am umoˇzn ˇuje zapracovat obsluhu ud´alosti onItemClick a zmiˇ novan´eho adapt´eru pˇr´ımo do tˇela Activity. V tˇele metody onCreate nastav´ıme metodou setContentView n´azev naˇseho layoutu main grid.xml (um´ıstˇen´eho v adres´aˇri res/layout), jehoˇz jednoduch´ y k´od je n´asleduj´ıc´ı:
android:horizontalSpacing="10dp"> D´ale v tˇele Activity definujeme GridView a propoj´ıme s n´azvem grid, abysme mohli nastavit adapt´er. Nastaven´ı adapt´eru (GridViewAdapter ) s tˇremi argumenty, kde definujeme tˇret´ı - items - pole s ˇretˇezci, kter´e chceme pomoc´ı GridView zobrazit. Tento adapt´er mus´ıme doprogramovat a vloˇzit ho do tˇela naˇs´ı Activity. Adapt´er je, ve srovn´an´ı s vlastn´ımi adapt´ery pro ListView, jednoduˇsˇs´ı a m˚ uˇze vypadat takto: private class GridViewAdapter extends ArrayAdapter
{ Context ctxt; GridViewAdapter(Context ctxt, int resource,String[] items) { super(ctxt, resource, items); this.ctxt=ctxt; } public View getView(int position, View convertView,ViewGroup parent) { TextView label=(TextView)convertView; if (convertView==null) { convertView=new TextView(ctxt); label=(TextView)convertView; } label.setText(items[position]); label.setTextSize(20); label.setGravity(Gravity.CENTER_HORIZONTAL); //set color for students if (position < 10) label.setTextColor(getResources().getColor(R.color.upolYellow)); return(convertView); } } Nakonec jeˇstˇe mus´ıme obslouˇzit ud´alost onItemClick, aby byly poloˇzky GridView aktivn´ı a mohly napˇr´ıklad spouˇstˇet dalˇs´ı Activity. Tato obsluha nen´ı sloˇzit´a a vypad´a takto: public void onItemClick(AdapterView> parent, View v,int position, long id) { switch (position) { case 0: //akademicky kalendar i = new Intent(HlavniMenuActivity.this, AcademicYear.class); i.putExtra("requestCode", 0); startActivityForResult(i,0); break; 33
case 1: ... } V tomto pˇr´ıpadˇe se po stisku prvn´ı poloˇzky zobrazen´ı GridView (Akademick´y kalend´aˇr ) spust´ı dalˇs´ı Activity s n´azvem AcademicYear. Indexy jsou poˇc´ıt´any z lev´eho horn´ıho rohu mˇr´ıˇzky do prava po ˇra´dc´ıch (plynou jako bˇeˇzn´ y text). 4.4.3.
WebView
Obr´azek 15. Uk´azka prvku WebView WebView je zobrazen´ı, kter´e vyuˇz´ıv´a intern´ı webov´ y prohl´ıˇzeˇc - renderovac´ı engine WebKit. Engine obsahuje metody pro navigaci vpˇred a vzad v historii, zvˇetˇsov´an´ı nebo zmenˇsov´an´ı a dalˇs´ı. WebKit vyˇzaduje pˇrid´an´ı opr´avnˇen´ı INTERNET do souboru AndroidManifest.xml, ˇcehoˇz dos´ahneme vloˇzen´ım tohoto elementu: <uses-permission android:name="android.permission.INTERNET" /> Ve sv´e aplikaci WebView vyuˇz´ıv´am k zobrazen´ı uˇzivatelsk´e pˇr´ıruˇcky - n´apovˇedy (viz obr´azek 15.), kter´a je cel´a vytvoˇren´a v HTML a uloˇzen´a v adres´aˇri /res/raw. Pro spr´avnou funkci WebView je opˇet nutn´ y XML layout a programov´ y k´od ve vaˇs´ı Activity. K´od Activity Help (obsahuje i metodu readTextFromResource, kter´a zpracov´av´a HTML k´od): @Override 34
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.help); WebView webview = (WebView) findViewById(R.id.webview_help); webview.loadDataWithBaseURL("file:///android_asset/", readTextFromResource(R.raw.help), "text/html", "utf-8", ""); } private String readTextFromResource(int resourceID) { InputStream raw = getResources().openRawResource(resourceID); ByteArrayOutputStream stream = new ByteArrayOutputStream(); int i; try { i = raw.read(); while (i != -1) { stream.write(i); i = raw.read(); } raw.close(); } catch (IOException e) { ... } return stream.toString(); } Jak vid´ıme v definici promˇenn´e webview, m´ame zde definov´ano propojen´ı s elementem Webview jmenuj´ıc´ıho se webview help, kter´ y je um´ıstˇen v XML layoutu s n´azvem help (jak vid´ıme v definici metody setContentView). XML layout souboru help.xml je tento: <WebView android:id="@+id/webview_help" android:layout_width="fill_parent" android:layout_height="fill_parent"> Tyto definice staˇc´ı na to, aby bylo zobrazen´ı WebView funkˇcn´ı - naˇc´ıtalo soubor help.html z adres´aˇre /res/raw a zobrazilo jej. 35
4.4.4.
Preferences
Preferences jsou ve spojen´ı s Shared Preferences jednou z moˇznost´ı jak ukl´adat data v Androidu. Preferences jsou pro kaˇzdou Activity zvl´aˇst’, zat´ımco Shared Preferences jsou dostupn´e pro celou aplikaci. Nejv´ıce se pouˇz´ıvaj´ı jako prostˇredek k nastaven´ı chov´an´ı programovan´e aplikace a ukl´ad´an´ı uˇzivatelsk´ ych nastaven´ı. Pokud bysme si chtˇeli uˇzivatelskou obrazovku s nastaven´ımi (obr´azek 16.) vytvoˇrit, mus´ıme si pro to zaloˇzit novou Activity. Tato vaˇse nov´a Activity ovˇsem nebude potomkem Activity, ale PreferenceActivity. Nav´ıc m˚ uˇzeme jeˇstˇe pˇridat implements OnSharedPreferenceChangeListener, pokud chceme, aby se zadan´e hodnoty nejenom zapsaly do Shared Preferences, ale i aktualizovalo zobrazen´ı na obrazovce (pokud napˇr´ıklad m´ame hodnoty uveden´e v druh´em ˇr´adku konkr´etn´ıho nastaven´ı) - k tomu je ale potˇrebn´e si doprogramovat obsluhu. V tomto pˇrikladu se, v r´amci zjednoduˇsen´ı, bez t´eto vymoˇzenosti obejdeme. K´od
Obr´azek 16. Uk´azka Preferences Activity EdiPreferences: import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity public class EditPreferences extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); ... 36
} Tento k´od ve spojen´ı s XML layoutem v pˇr´ıloze B. vygeneruje uˇzivatelsk´a nasyhodou taven´ı podle XML souboru, a v´ ysledkem je obrazovka na obr´azku 16. V´ Shared Preferences je jednoduch´a implementace a dostupnost vˇsech uloˇzen´ ych prostˇredk˚ u napˇr´ıˇc celou aplikac´ı a to i po vypnut´ı a opˇetovn´em spuˇstˇen´ı aplikace. Je to d´ano t´ım, ˇze se jednotliv´a nastaven´ı ukl´adaj´ı do intern´ıho u ´loˇziˇstˇe v podobˇe XML souboru obsahuj´ıc´ıho vˇsechna naˇse nastaven´ı.
4.5.
Zpracov´ an´ı dat z IS/STAG
Protoˇze veˇsker´e zpr´avy z IS/STAG jsou ve form´atu XML, viz k´od v kapitole 2.3., je nutn´e jej zpracovat a uloˇzit data do takov´e formy s kterou m˚ uˇzeme v programov´em k´odu aplikace (Activity) pracovat. Extrakci dat z XML pˇredvedu na jednoduch´em XML s n´asleduj´ıc´ımi daty harmonogramu akademick´eho roku: <ns1:getHarmonogramRokuResponse> 10.9.2011 <popis>Zaˇ c´ atek ak. roku 10.9.2011 <popis>Zac´ ın´ a: Letn´ ı zkouˇ skov´ e obdob´ ı Zpracov´av´an´ı a stahov´an´ı dat z IS/STAG ˇreˇs´ım priv´atn´ı metodou DownloadXML. Se zpracov´av´an´ım XML mˇe pomohl ˇcl´anek Connecting to the Web: I/O Programming in Android [7], ˇreˇs´ıc´ı zpracov´av´an´ı RSS k´od˚ u. V n´asleduj´ıc´ım k´odu je stahov´an´ı XML zajiˇstˇeno metodou OpenHttpConnection, kter´a vrac´ı InputStream. Tento je n´aslednˇe zpracov´av´an a jsou k tomu vyuˇz´ıv´any podtˇr´ıdy javax.xml.parsers - konkr´etnˇe DocumentBuilder, DocumentBuilderFactory a ParserConfigurationException. Definujeme si z´akladn´ı element (harmonogramItem) a pak proch´az´ıme XML a hled´ame vˇzdy dalˇs´ı element harmonogramItem a v cyklu for naˇc´ıt´ame obˇe datov´e poloˇzky a ukl´ad´ame si je pomoc´ı objektu sr. V´ ypis metody DownloadXML s koment´aˇrem v tˇele: private ArrayList DownloadXML(String URL) { InputStream in = null; ArrayList items = new ArrayList(); 37
try { in = global.OpenHttpConnection(URL,this); Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); doc = db.parse(in); } catch (Exception e) { ... } doc.getDocumentElement().normalize(); //tady se definuje nadˇ razen´ y element NodeList itemNodes = doc.getElementsByTagName("harmonogramItem"); TwoRowListItem sr; for (int i = 0; i < itemNodes.getLength(); i++) { Node itemNode = itemNodes.item(i); if (itemNode.getNodeType() == Node.ELEMENT_NODE) { sr = new TwoRowListItem(); Element itemElement = (Element) itemNode; //extrakce popisu z elementu harmonogramItem a uloˇ zen´ ı do objektu sr NodeList nameNodes = (itemElement).getElementsByTagName("popis"); Element nameElement = (Element) nameNodes.item(0); NodeList txtNodes = ((Node) nameElement).getChildNodes(); sr.setTxtBig(((Node) txtNodes.item(0)).getNodeValue()); //extrakce datumu z elementu harmonogramItem a uloˇ zen´ ı do objektu sr NodeList nameAbrNodes = (itemElement).getElementsByTagName("datumOd"); Element nameAbrElement = (Element) nameAbrNodes.item(0); NodeList txtNameAbrNodes = ((Node) nameAbrElement).getChildNodes(); sr.setTxtSmall(((Node) txtNameAbrNodes.item(0)).getNodeValue()); items.add(sr); } } } catch (IOException e1) { ... } return items; } Metoda DownloadXML vrac´ı ArrayList, kter´ y definuji jako argument sv´emu adapt´eru, jenˇz ho pak patˇriˇcnˇe zobraz´ı. 38
Z´ avˇ er Tvorba aplikac´ı pro operaˇcn´ı syst´em Android nen´ı na prvn´ı pohled jednoduch´a, protoˇze v´ yvoj´aˇr mus´ı m´ıt hned na zaˇc´atku pomˇernˇe dost znalost´ı - nav´ıc r˚ uzn´eho druhu. Nicm´enˇe pokud pˇrekon´ate tyto poˇc´ateˇcn´ı n´aroky, otevˇre se v´am najednou netuˇsen´e spektrum moˇznost´ı k vyuˇzit´ı nabit´ ych znalost´ı. Co se t´ yk´a aplikace Klient Stagu pro Android, kterou jsem pˇredv´adˇel sv´ ym spoluˇz´ak˚ um a z jejich reakc´ı mohu ˇr´ıct, ˇze si uˇzivatele jistˇe najde. Uˇzivatel˚ um, stejnˇe jako mˇe, pˇriˇsly nejzaj´ımavˇejˇs´ı funkce Moje zkouˇskov´e term´ıny, M˚ uj rozvrh a moˇznost napsat email pˇrimo z mobiln´ıho zaˇr´ızen´ı konkr´etn´ımu uˇciteli bez znalosti jeho emailov´e adresy.
39
Conclusions Creating applications for operating system Android is not that easy as seems to be, because developer has to have wide range of knowledge in different kinds. However if you pass initial demands, it would open to you unexpected posibilities to use knowledge in Android development. Application Stag client for Android I showed my schoolmates and I can say that it would definitely have its users. Users like the most My exam terms, My schedule and ability to send an e-mail to a teacher directly from mobile device, without exact e-mail address knowledge.
40
Reference [1] Mark L. Murphy. Android 2 – Pr˚ uvodce programov´ an´ım mobiln´ıch aplikac´ı. Computer Press, Brno, 2011. [2] Sharon Zakhour. Java - V´yukov´y kurz. Computer Press, Brno, 2007. [3] Tom´aˇs Kypta. Vyv´ıj´ıme pro Android, Seri´ al Vyv´ıj´ıme pro Android na serveru Svˇet Androida [4] Google. Android Developers [5] Dokumentace webov´ ych sluˇzeb Univerzity Palack´eho v Olomouci. Webov´e sluˇzby nad IS/STAG Univerzity Palack´eho v Olomouci [6] Dokumentace webov´ ych sluˇzeb Z´apadoˇcesk´e univerzity v Plzni. Webov´e sluˇzby nad IS/STAG Z´apadoˇcesk´e univerzity v Plzni [7] Wei-Meng Lee. Connecting to the Web: I/O Programming in Android . ˇ anek na Internetu, 2010. Cl´ [8] Wikipedia. The Free Encyklopedia
41
A.
Zdrojov´ y k´ od ExamListBaseAdapter.java
package biz.pesek.klientstagu; import java.util.ArrayList; public class ExamListBaseAdapter extends BaseAdapter { private static ArrayList<Exam> examArrayList; private LayoutInflater mInflater; public ExamListBaseAdapter(Context context, ArrayList<Exam> results) { examArrayList = results; mInflater = LayoutInflater.from(context); } public int getCount() { return examArrayList.size(); } public Object getItem(int position) { return examArrayList.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.exam_list_row, null); holder = new ViewHolder(); holder.tvPredmet = (TextView) convertView.findViewById(R.id.name); holder.tvJmeno = (TextView) convertView.findViewById(R.id.examiner); holder.tvDatum = (TextView) convertView.findViewById(R.id.date); holder.tvCasOd = (TextView) convertView.findViewById(R.id.time); holder.tvBudova = (TextView) convertView.findViewById(R.id.location); holder.tvPoznamka = (TextView) convertView.findViewById(R.id.note); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvPredmet.setText(examArrayList.get(position).getPredmet()); holder.tvJmeno.setText(examArrayList.get(position).getJmeno() 42
+" "+examArrayList.get(position).getPrijmeni()); holder.tvDatum.setText(examArrayList.get(position).getDatum()); holder.tvCasOd.setText(examArrayList.get(position).getCasOd()); holder.tvBudova.setText(examArrayList.get(position).getBudova() +"-"+examArrayList.get(position).getMistnost()); if (examArrayList.get(position).getPoznamka().equals("")) holder.tvPoznamka.setVisibility(View.GONE); else { holder.tvPoznamka.setVisibility(View.VISIBLE); holder.tvPoznamka.setText(examArrayList.get(position).getPoznamka()); } return convertView; } static class ViewHolder { TextView tvPredmet; TextView tvJmeno; TextView tvPrijmeni; TextView tvTitulPred; TextView tvTitulZa; TextView tvDatum; TextView tvBudova; TextView tvMistnost; TextView tvCasOd; TextView tvPoznamka; } }
43
B.
Zdrojov´ y XML k´ od preferences.xml
<EditTextPreference android:dialogTitle="@string/enter_personal_id" android:key="personal_id" android:summary="@string/enter_personal_id" android:title="@string/personal_id" /> <EditTextPreference android:dialogTitle="@string/enter_teacher_id" android:key="ucitIdno" android:summary="@string/enter_teacher_id" android:title="@string/teachers_id" />
44
C.
Obsah pˇ riloˇ zen´ eho CD
V samotn´em z´avˇeru pr´ace je uveden struˇcn´ y popis obsahu pˇriloˇzen´eho CD/DVD, tj. z´avazn´e adres´aˇrov´e struktury, d˚ uleˇzit´ ych soubor˚ u apod. bin/ Instalaˇcn´ı bal´ıˇcek KlientStagu.apk vytvoˇren´e aplikace pro operaˇcn´ı syst´em Android. doc/ Dokumentace pr´ace ve form´atu PDF, vytvoˇren´a dle z´avazn´eho stylu KI PˇrF pro diplomov´e pr´ace, vˇcetnˇe vˇsech pˇr´ıloh, a vˇsechny soubory nutn´e pro bezprobl´emov´e vygenerov´an´ı PDF souboru dokumentace (v ZIP archivu), tj. zdrojov´ y text dokumentace, vloˇzen´e obr´azky, apod. src/ Kompletn´ı zdrojov´e texty programu KlientStagu pro Android se vˇsemi potˇrebn´ ymi (pˇrevzat´ ymi) zdrojov´ ymi texty, knihovnami a dalˇs´ımi soubory pro bezprobl´emov´e vytvoˇren´ı spustiteln´ ych verz´ı programu. readme.txt Instrukce pro instalaci a spuˇstˇen´ı programu KlientStagu pro Android, vˇcetnˇe poˇzadavk˚ u pro jeho provoz. U veˇsker´ ych odjinud pˇrevzat´ ych materi´al˚ u obsaˇzen´ ych na CD/DVD jejich zahrnut´ı dovoluj´ı podm´ınky pro jejich ˇs´ıˇren´ı nebo pˇriloˇzen´ y souhlas drˇzitele copyrightu. Pro materi´aly, u kter´ ych toto nen´ı splnˇeno, je uveden jejich zdroj (webov´a adresa) v textu dokumentace pr´ace nebo v souboru readme.txt.
45