You are on page 1of 108

MalakolaAndroida

by
Vidi

android.vidilab.com

RIPedby:Memhis
(12/2012)

Sadraj:
1.PripremarazvojneokolinezapisanjeGoogleAndroidaplikacija
2.Pisanjeipokretanjeprvogprograma
3.Interakcijaskorisnikom
4.Uvodupisanjeprogramskogakoda
5.Koritenjerasporedakontrolausloenimaplikacijama
6.KoritenjeosnovnihAndroidkontrola
7.Androidprogramiranje
8.AndroidkontroleuakcijiIV
9.Koritenjedatotenogsustava
10.Nekolikostandardnihdijelovaaplikacije
11.Standardnidijeloviaplikacije
12.Alternativnipristuprazvojuaplikacija
13.AlternativnipristuprazvojuaplikacijaII
14.AlternativnipristuprazvojuaplikacijaIII
15.Izradasloenijihaplikacija
16.Koritenjekartografskihservisa
17.tojenovou3.xizdanjima

1.PripremarazvojneokolinezapisanjeGoogleAndroid
aplikacija
elimo li programirati za platformu Google Android najprije na raunalo trebamo instalirati i
konfiguriratirazvojnealate.Venatomkorakumnogiodustaju,jersezarazvojkoristetrirazliita
alata,asvakiodnjihimadrugaijegproizvoaa.Dabisveproradilokakotreba,instalacijutreba
napravitibapremapropisima.
Krenimo redom, uz jednu bitnu pretpostavku. Postupak instalacije opisan je za isto Windows
raunalo,toznaidajenanjemuinstaliransamooperativnisustav,beznekeodstarijihinaica
alata
koje
emo
spomenuti
u
nastavku.
Naraunalunisupokrenutinisvakakviantivirusniprogrami,vatrozidilisliniprogrami,jerbioni
mogli blokirati neke od opisanih postupaka. U takvom sluaju ne moemo pretpostaviti svaku
moguusituacijuupraksi,odnosnoobjasnitikakorijeitinastaliproblem,pazatopreporuujemo
dapostupakzaponeteodnultekonfiguracijesustava.
Kao to smo to ve ranije spomenuli, na raunalo treba instalirati tri razvojna alata razliitih
proizvoaa. Iako sve moe proraditi i ako se ne koriste ba inaice s identinim oznakama na
zadnju decimalu, nego neke druge brojano sline inaice, preporuujemo vam da koristite
iskljuivooneopisaneunastavkutekstajersnjimasvesigurnoiprovjerenoradi.Osimtoga,svatri
alata dostupna su na DVDu travanjskog broja asopisa VIDI, ukoliko ne elite gubiti vrijeme na
njihovopreuzimanjesweba.
Alatetrebainstaliratiovimredoslijedom:
1.jdk6u17javafx1_2_1windowsi586.exe
2.eclipsejavagalileoSR2win32.zip
3.androidsdk_r04windows.zip
Datoteka jdk6u17javafx1_2_1windowsi586.exe Sunov je razvojni alat za Java aplikacije pod
oznakomJavaSEDevelopmentKit6Update17.UtojdatotecinalaziseSunovrazvojnialatzaRIA
aplikacije s oznakom JavaFX 1.2 SDK. Kad ve morate instalirati Javu kao preduvjet za pisanje
Google Android aplikacija, zato ne biste instalirali i razvojni alat za RIA aplikacije istog
proizvoaa? Moda vam nekad zatreba neto takvo, iako JavaFX SDK nije preduvjet za razvoj
Androidaplikacija.
InstalacijaSunovogproizvodanajvieliinainstalacijuprofesionalnograzvojnogalatanakakvuste
vjerojatnonavikli,pajezatoneemoniposebnoopisivati,jerjedoistarijeotrivijalnompostupku.
Dovoljno je pokrenuti prije spomenutu datoteku te jednostavno prihvatiti sve podrazumijevane
postavkeinstalacije.Jediniizuzetakmoglabibitiinjenicadanapodrazumijevanomdiskunemate
dovoljno prostora, ali odgovarajua korekcija zaista ne bi trebala stvoriti previe problema kod
instalacije.
ZainstalacijudrugedatotekeeclipsejavagalileoSR2win32.zip,potrebanvamjenekiodalataza
raspakiravanjezipdatoteka,naijestekoritenjevjerojatnonavikli,panituneemogubitiprevie
prostoranaopisivanjepostupkarapakiravanja.Rezultatraspakiravanjajestmapaeclipsezajednos
pripadajuimpodmapama.Mapumoeteobjesitiizravnonakorijenskumapu\,ilijestavitinaza
touobiajenomjestoC:\ProgramFiles.Unavedenojmapinalaziseizvrnadatotekaeclipse.exena

kojunakontogamoetenapravitipreacnaradnojpovrinioperativnogsustava,kakobistejeto
jednostavnijepokretalitijekombuduegkoritenja.
ObjasnimoukratkotojetozapravoEclipse?Rijejeovrlonaprednojrazvojnojokolinizapisanje
razliitih vrsta aplikacija, a upravo je tu razvojnu okolinu predvidio i Google za razvoj Android
aplikacija. Za sada o njoj samo toliko, a neto vie detalja o koritenju navest emo u buduim
nastavcimakadnamzatrebajurazliitemogunostirazvojneokolineupisanjuaplikacija.

Prvekomplikacije
Kodtreegkorakanastupajukomplikacije.GoogleovrazvojnialatnalazisetakoeruZIPoblikupa
gakaoiEclipsetrebaprvootpakirati.Kaorezultatdobivasemapaandroidsdkwindows.Njezino
mjestoodaberitenaistinainkaouprethodnomkoraku.
U ovom sluaju potrebno je napraviti jo jednu dodatnu operaciju, a to je postavljanje varijable
operativnogsustavaPath,takodapokazujenatumapu.Iovobitrebaobitipostupakpoznatneto
iskusnijimkorisnicimaWindowsa,dokonemanjeiskusneupuujemonaprvuprateuslikuuztekst
kojapokazujekakosetajpostupakizvodiuhrvatskojinaiciWindowsa7.Drugaslikapokazujeistu
stvaruengleskojinaici.
Ukratko, treba otvoriti upravljaku plou Windowsa (Control Panel) te u njoj pronai opciju
namijenjenu dodatnom podeavanju parametara operativnog sustava, kao to su performanse
sustava(ukljuujuivirtualnumemoriju),korisnikiprofiliislino.Natommjestunalazisegumbza
podeavanje varijabli okruenja (Environment Variables). Nakon otvaranja istoimenog dijalokog
okviraupopisusistemskihvarijabli,trebapronaivarijabluPathteunjuukljuitiputanjudomape
androidsdkwindows.Uslicinaprimjerutojenapravljenonasamompoetkuvarijable.

Zajednikijezik
Akojedosadasveprolobezproblema,naraunalosuinstaliranasvatriosnovnaalata,alismo
joprilinodalekoodpisanjaprvihaplikacija.Trebanapravitijonekolikododatnihkorakakakobi
se sva tri alata meusobno razumjela te tako doista omoguila stvaranje vlastitih Android
aplikacija.Krenimokroznovinizkorakaukonfiguriranjusustava.
PrvotrebapokrenutiEclipse.Kodprvogpokretanjarazvojneokolinebitezatraenodaizaberemo
neku mapu na disku koja e u budunosti sluiti kao radni prostor za druge projekte. Moemo
izabratimapupoputC:\workspace,ilinetodrugopremavlastitomnahoenju.Nakontogaotvara
seglavniprozorrazvojneokolineukojemtrebaizvestisljedeinizkorakadabiseEclipsepovezaos
GoogleAndroidsustavom.

1.ZapoetakurazvojnojokolinitrebaizabratinaredbuHelp>InstallNewSoftware

2.UdijalokomokviruInstall,kojiseotvaranakontoga,trebakliknutinagumbAdd.

3.Kaorezultatprethodneoperacije,otvarasedijalokiokvirAddSitesokvirimaNameiLocation.
U prvi okvir treba upisati neto to e oznaavati o kakvim je dodacima za Eclipse rije na
primjer, Android dodaci ili Android Plugin. U drugo polje (Location) treba upisati sljedei tekst:
https://dlssl.google.com/android/eclipse/

4.NakontogatrebakliknutinagumbOK.

5. Nakon povratka na prethodni dijaloki okvir, trebali biste vidjeti oznaku novog dodatka. Na
ovom dijalokom okviru oznaite okvir Developer Tools, a onda preostaje dva puta kliknuti na
gumbNexttezavritiprvidiopodeavanjaradneokoline.
Napomena: Vrijeme koje je potrebno da razvojna okolina posloi sve to treba nakon prvog
pritiskanagumbNextmoebitiprilinodugo(ovisnoobrziniraunalaivezinaInternet,tomoe
potrajatiakdesetakminuta).Nemojtenikakonasiluprekidatipostupak,jerjesveuredu,samo
to zbog nekog razloga sve traje poprilino dugo. Na kraju ovog koraka treba jo prihvati uvjete
koritenjelicence,aondakliknutinagumbFinish.
6.SadaizaiteizrazvojneokolineEclipsepajenakontogaponovnopokrenite.Usluajudaprije
svoga zatvaranja razvojna okolina eli napraviti odreena auriranja vlastitih postavki, strpljivo
saekajtedasedovriitajpostupak.
7. Nakon ponovnog otvaranja razvojne okoline, izaberite naredbu izbornika Windows >
Preferences kako biste otvorili dijaloki okvir Preferences. Na prikazanom popisu u lijevoj strani
prozoratrebapronaivrijednostAndroid,aondanadesnojstraniuokvirSDKLocationsupisati(ili
izabrati)putanjudoGoogleAndroidSDKpaketatepotvrditiodabirpomougumbaOK.

8.Konanosmostigliidoposljednjegkorakaupodeavanju,alieonnaalostvremenskipotrajati
kao svi prethodno nabrojani koraci, poevi od instalacije Sunovog paketa. Potrebno je izabrati
naredbuWindows>AndroidSDKandAVDManager.Kaorezultatizvoenjaprethodneoperacije,
otvaraseistoimenidijalokiokvirsprikazomdostupnihtetrenutnoinstaliranihinaicaAndroida.
Kako na poetku nije instalirana jo ni jedna inaica paketa, izaberite sve koje elite koristiti u
praksiteprihvatitenjihovuinstalacijupomougumbaInstallSelected.


Nakon dovretka ovog koraka, vae raunalo konano je spremno za razvoj Google Android
aplikacija jer su na njemu svi potrebni sistemski moduli, a to je najvanije, sada se konano i
meusobnorazumiju.Tomoeteprovjerititakodaurazvojnojokolini Eclipseizaberetenaredbu
File > New > Project. Nakon toga, u dijalokom okviru New Project trebali biste moi zapoeti
AndroidProject,dokbisteusljedeemdijalokomokviruNewAndroidProjecttrebalimoiizabrati
razvojaplikacijaurazliitiminaicamaAndroida.

Vananapomenazakraj.Akonamjeravatenavlastitoraunaloukoraku8izabratiinstalacijusvih
inaicaAndroida,ondasetrebatenaoruatipoprilinomdozomstrpljenja.Najboljejedapotvrdu
preuzimanja svih inaica okinete prije poetka nekakve dobre nogometne ili bar rukometne
utakmice, jer itav postupak traje beskrajno duuuuuugooooooo. Ne nije nikakva ala. Ba kad
zavriutakmicaligeprvaka,instalacijaebitidovrena.Naovajdetaljupozoravamovaszatotobi
veina korisnika nenavikla na tako dugo vrijeme odziva raunala na zadanu operaciju vjerojatno
nasilnoprekinulakorak8,azapravojesveuredu.Jednostavnonemapomoimoratesaekatida
sepostupakzavrikakobistemoglipoetispisanjemvlastitihaplikacija.

2.Pisanjeipokretanjeprvogprograma

Proliputsmoumalopoduempoetnomtekstuobjasnilizatopokreemonovukolu
programiranjaikojisunamsvealatipotrebnizanju,odnosnokakoihtrebainstaliratinaraunalo
dabisveproradilonaodgovarajuinain.BuduidajezarazvojGoogleAndroidaplikacija
potrebnoinstaliratinekolikoalatarazliitihproizvoaa,takvainstalacijanikadneprolazitako
glatkokaokadjerijeoinstalacijipojedinanogarazvojnogalatasamojednogproizvoaa.
Ok, ako ste napravili sve to smo napisali u prolom nastavku, sad biste trebali imati raunalo
spremnozapisanjeprvogGoogleAndroidprograma,toemodoistainapravitiunastavkuteksta.
Usput emo malo zagrepsti po glavnim dijelovima razvojne okoline potrebnim za razvoj takve
vrsteaplikacija,kaoisamomemulatoruodgovarajueghardverskogureaja,jernakrajukrajeva,
tek u njemu moemo vidjeti rezultate rada naeg programa na smisleni nain. Nakon toga se u
sljedeim brojevima moemo pozabaviti samim programiranjem i naprednijim programskim
tehnikama.

StvaranjeprojektaHelloWorld:Ovakoizgledapoetnidijalokiokvirkodstvaranjaprojekta
Kako rezervirani prostor za ovaj serijal u nekoliko brojeva asopisa jednostavno nije dovoljan za
detaljnijebavljenjerazvojnomokolinom,togsegmentarazvojaaplikacijedotaknutemosesamo
kadnetopostanezaistaneophodno.Ipak,akostedosadvekoristilinekuodmodenijihrazvojnih
okolina za razvoj aplikacija (a napomenuli smo da praenje serijala zahtijeva odreeno
predznanje), onda ne biste trebali imati previe problema ni sa snalaenjem u razvojnoj okolini
Eclipse.
Kaototodobraprogramerskatradicijanalae,priuoprogramiranjuuGoogleAndroiduzapoet
emo od trivijalnog HelloWorld primjera. Njegova namjena jest pokazati kako se u novom
razvojnom okruenju prikazuje jednostavna poruka korisniku programa. Za mlae (ili starije)
itatelje koji moda upravo sada prvi put zapoinju avanturu programiranja u nekom
programskom jeziku, treba napisati samo kratko objanjenje zato se u gotovo svakoj koli
programiranja zapoinje s tako trivijalnim primjerom budui da on sam za sebe zapravo ne radi
nitakorisno.Idejaupripremitakojednostavnogprimjerajestutomedaseprogramertobre
upoznasnovimprogramskimjezikom,aliinjegovimrazvojnimokruenjem,kakobisenakontoga
tobremogloprijeinasloenijeprobleme.
ZapisanjenovogprogramapotrebnojeurazvojnojokoliniEclipseizabratinaredbuFile>New>
Project te u dijalokom okviru prikazanom u nastavku odabrati odgovarajuu vrstu projekta. U
ovom sluaju to je Android Project. Kao rezultat izvoenja prethodne operacije, pojavljuje se
dijaloki okvir New Android Project gdje se od programera oekuje upisivanje nekoliko polaznih
podatakaovlastitomprojektu.
Project Name predstavlja naziv projekta na kojem trenutno radimo. U ovom sluaju, to e biti
HelloWorld. Osim naziva projekta, potrebno je izabrati mjesto na disku za spremanje njegovih
sastavnih dijelova. To moe biti podrazumijevana radna povrina definirana prilikom prvog
pokretanja radne okoline, neko tono odreeno mjesto na disku, ili se u razvoj projekta moe
krenutiodvepostojeegprojektarecimonekogodprateihprimjeraGoogleAndroidprojekata.
Za sada na ovom mjestu moemo ostaviti podrazumijevane vrijednosti, dakle ukljuene opcije
CreateNewProjectinWorkspaceteUsedefaultlocation.

Projekt HelloWorld nakon stvaranja: Automatski je generiran itav niz datoteka koje se mogu
pregledatiurazvojnojokoliniEclipse.
Projekt HelloWorld nakon stvaranja: Automatski je generiran itav niz datoteka koje se mogu
pregledatiurazvojnojokoliniEclipse.
UsluajudajenaraunaloinstaliranovieinaicarazvojnihpaketaGoogleAndroidSDK,potrebno
jeizabratijedanodnjih,nakogegaeseodgovarajuaoznakainaicepojavitiuokviruMinSDK
Versionnadnudijalokogokvira.Dabisemoglonastavitisradomnaprojektu,potrebnojenavesti
jonekolikopodataka.UokvirApplicationNametrebaupisatinazivaplikacije,tomoebitibilo
kakavnizznakova,dakleionajjednaknazivuprojekta.UPackageNametrebaupisatinazivJava
paketa.Ovajnazivtrebabitisastavljenodnajmanjedvadijelameusobnoodvojenatokomna
primjer helloWorld.java (prema uobiajenim konvencijama prvo slovo treba biti malo). U okvir
Create Activity treba upisati naziv prve aktivnosti u Google Android projektu na primjer
helloWorld.
Sada je mogue kliknuti na gumb Next te tako prijei na sljedei dijaloki okvir namijenjen za
stvaranjeodgovarajuegapomonogprojektazatestiranje.Projektizatestiranjenamijenjenisuza
pojednostavljenoponavljanjetestiranjavrlosloenihGoogleAndroidprojekta(kakavHelloWorld
zasigurnonije),aliemonaipakkreiratitakavprojektkakobismoseupoznaliistommogunou
razvojnogalata.Naovommjestumoguseostavitisvepredloenevrijednostitozaposljedicuima
stvaranjeprojektaHelloWorldTest.Nakonizvoenjasvihprethodnonabrojenihoperacija,uradnoj
povrini na disku stvara se itava hrpa datoteka, a sadraj svake od njih moe se vidjeti u
odgovarajuemprozoruradneokoline.Zajednostavnijesnalaenjenajboljejekoristihijerarhijski
prikazdijelovaprojektauposebnomprozorunalijevomdijelurazvojneokoline(Navigator).

Upravljanje virtualnim ureajima: Omoguuje testiranje projekta na razliitim emulacijama


hardverskihkarakteristika.

Budui da je razvojna okolina automatski pripremila itav niz datoteka, prva ideja koja nam
svakako mora pasti na pamet isprobavanje je nastale situacije. Najjednostavniji nain za to jest
odabir naredbe Run As > Android Application iz padajueg izbornika povezanog s projektom
HelloWorld. Podrazumijeva se da se ista naredba moe izvesti na bar jo nekoliko naina kao u
svim modernim razvojnim okolinama na primjer odabirom istoimene naredbe iz glavnog
izbornikailiodgovarajueikonenaalatnojtraciprozora.Natajdetaljvieseneemovraatiniu
ovom ni u buduim tekstovima, nego istraivanje alternativnih mogunosti ostavljamo samim
itateljima.
Budui da je cijeli Android sustav namijenjen razvoju aplikacija za prijenosne mobilne ureaje,
razumljivojedaseaplikacijanemoeizvestiuzraku,negonamjezatopotrebannekakavureaj
za njezino izvoenje ako nita drugo, onda bar u obliku softverske emulacije. Takav softverski
strojnazivaseAndroidVirtualDeviceiliskraenoAWD.Akonekakvakonfiguracijaemulatorave
ne postoji od prije, treba je pripremiti prema konkretnim potrebama za testiranje vlastite
aplikacije. Za upravljanje virtualnim ureajima koristi se dijaloki okvir Android SDK and AVD
Manager,toukljuujeoperacijepoputstvaranjaureaja,njegovogbrisanja,ispravljanjatemoda
najvanije,pokretanjaureaja.Kljunihardverskiparametrikojisemogudefiniratikodstvaranja
novogavirtualnogstrojajesukoliinaraspoloiveradnememorijeterezolucijazaslona.
Nakon stvaranja novoga virtualnog ureaja, u njega je mogue uitati, a nakon toga i isprobati
vlastituaplikaciju.Buduidazasadanaaaplikacijapredstavljasamogolikosturaplikacijetekao
takvazapravoneradinitapametno,niuvirtualnomureajunemasemnogotogazavidjetiosim
osnovne poruke korisniku programa. U sluaju da se tekst iz aplikacije ne prikae automatski u
virtualnomureaju,kliknitenagumbMenuprikazannaprozoruvirtualnogureaja.
Trenutnostanjeprogramskogakodaimaoblikprikazanunastavku,alinetrebasmetnutisumada
tonijejedinidioaplikacije.Tako,naprimjer,zapreglediizmjenuprikazaneporuketrebaotvoriti
datotekustrings.xml,hijerarhijskismjetenuumapires/values.
packagehelloWorld.java;importandroid.app.Activity;
importandroid.os.Bundle;publicclasshelloWorldextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Na slian nain, otvaranjem datoteke main.xls smjetene u mapi res/layout, moe se oblikovati
grafiko suelje aplikacije na nain vrlo slian izvoenju odgovarajuih postupaka u drugim
modernim razvojnim okolinama na primjer Microsoft Visual Studio. Kao osnovnu vjebu u
koritenju razvojne okoline, probajte u vlastitu aplikaciju dodati jedan gumb te mu eventualno
podesitinekaodsvojstavazaodreivanjeizgledauprozoruProperties.


Virtualni ureaj u akciji: Stvarni izgled ovisi o parametrima definiranim prilikom njegovog
stvaranja.

Vizualnapripremasueljaaplikacije:Izvodiseuposebnomprozoruradneokoline.

Spomenimo na ovom mjestu kako se itava operacija prevoenja izvornoga koda, pokretanja
virtualnogureajateuitavanjaprevedenogprogramauureajmoeopisatisvakako,alisigurno
ne pojmom brza operacija, bez obzira na snagu raunala. Ako ste ve ranije probali sline
kombinacije razvojnih alata i emulatora drugih proizvoaa, onda sigurno niste iznenaeni
prethodnom tvrdnjom, jer ste na to ve jednostavno navikli. Dobra vijest je da je vrijeme
uitavanja nove inaice aplikacije u ve pokrenuti virtualni ureaj bitno krae, to znai da je
isprobavanje vlastite aplikacije nakon manjih promjena izvornoga koda ipak prilino bezbolan
proces.
SpomenimonakrajudananjegpredstavljanjapoetnihkorakaurazvojuAndroidaplikacija,jerse
dovrena i testirana Android aplikacija moe pripremiti za distribuciju u obliku datoteke s
nastavkom .apk. Rije je o komprimiranoj datoteci sastavljenoj od veeg broja datoteka koje
sadre sve potrebne informacije za izvoenje aplikacije na ureaju s ugraenom podrkom za
Google Android. Kad zavrite ovu kolu i napiete prve kvalitetne aplikacije, prrua vam se
mogunost da poneto i zaradite putem online trgovine Google Android aplikacija, koja
svakodnevnodobivasveveibrojnaslovaodprogramerairomsvijeta.

3.Interakcijasakorisnikom

Drugi nastavak nove kole programiranja u razvojnom alatu Google Android bio je namijenjen
izradiklasineaplikacijeusvimkolamaprogramiranjaopepoznatogprimjeraHelloWorld.Cilj
projektabiojebrzoupoznavanjedijelovarazvojneokolinepotrebnihzaizraduvlastitihaplikacija,
dok o samom programiranju nije bilo reeno ba mnogo. U biti, u prolom tekstu samo smo
isprobali ono to je automatski pripremila razvojna okolina. Ovaj put idemo korak dalje pa
poinjemoupoetnuaplikacijudodavatiprveobjekte,anakontogaiprogramskikodzanjihovu
reakciju na dogaaje u okolini, to jest na operacije korisnika programa. Usput emo se malo
pozabavitiiposebnomterminologijomkojasekoristitijekomradanaGoogleAndroidprojektima.
Prije nego ponemo zaozbiljno, dopustite da se osvrnemo na bitan tehniki detalj. Moderna
razvojnaokolinakaotojeEclipseimaitavnizprozorazadefiniranjerazliitihdijelovaprojekta,
pa se poetniku nije ba uvijek lako snai sa svim tim dijelovima, posebno ako je neki od bitnih
prozorazatvorenilipremjetenspodrazumijevanogmjestasluajnoilinamjerno.Kakobiolakao
praenjeteksta,autorsetrudidapriloeneslikeuztekstuvijekpokazujubitnedijelove.Problem
nastajekadsezbogovogilionograzloga(najeenedostatkaprostorauasopisu),nekaodslika
moraizostaviti,ilisesmanjitako dajeteko razaznatinekedijelove. Zatoemo(barupoetku)
stalnonavoditinesamototrebanapravitidabisedovrilanekaoperacijanegoikakosezapravo
stiedotogmjesta.
Navedimo prvo to elimo postii u dananjem i sljedeem nastavku. U osnovni projekt,
HelloWorld,izprolognastavkaelimododatitrinovaobjektajedanokvirzaprikaziunosteksta
od strane korisnika te dva dodatna gumba za upravljanje tim okvirom. Odmah pri pokretanju
programaokvirzatekstseprogramskipunipoetnomvrijednou,apritisakmiemnabilokojiod
dodatna dva gumba izaziva zamjenu poetnog sadraja drugaijim tekstom. Dakle, nita
spektakularno u smislu izvoenja programa, ali i tako jednostavan primjer demonstrira razliite
nainekoritenjaGoogleAndroidsustavaurazvojuaplikacijazamobilneureaje.

Rad na proirenju poetnog HelloWorld projekta zapoinjemo otvaranjem datoteke main.xml u


prozoru radne okoline, pod nazivom Android Layout Editor, jer je on namijenjen grafikom
ureivanjuizgledavlastiteaplikacije.Naravno,buduidajeuosnovirijeoobinoj.xmldatoteci,
moemo je otvoriti i u nekom od tekstualno orijentiranih prozora, ali se to ba ne preporuuje
poetniku.NaovommjestupostojivelikstupanjanalogijesastvaranjemHTMLdokumenata(toje
vjerojatno poznato bar dijelu itatelja). HTML dokument moemo stvoriti izravnim upisivanjem
sastavnih dijelova u tekstualnom obliku (tei nain), ili njihovim crtanjem u odgovarajuem
grafiki orijentiranom alatu (laki nain). Za sada emo i u razvojnoj okolini Eclipse izabrati laki
nainizradekorisnikogsuelja,akadpostaneteiskusniji,moetekoristitiobanaina.Spomenimo
na ovom mjestu namjenu prozora Outline, koji zapravo predstavlja neto izmeu. U njemu je
vidljiv samo popis osnovnih dijelova od kojih se sastoji korisniko suelje aplikacije, kao i njihov
meusobni odnos, ali ne i drugi detalji za odreivanje izgleda. Korisniko suelje aplikacije iz
prolognastavkabilojesastavljenoodsvegadvadijela:LinearLayoutiTextView.Prvidiopripada
grupi objekata namijenjenih odreivanju meusobnog rasporeda osnovnih objekata koji ine
korisnikosuelje(uterminologijiGoogleAndroidatosulayoutsobjekti).Udananjemnastavku
neemo se detaljnije baviti ovim dijelom oblikovanja korisnikog suelja, nego to ostavljano za
budue nastavke serijala. Za sada spomenimo samo da je tijekom inicijalne pripreme projekta
uporabljenprilinojednostavanrasporedobjektapodprijespomenutimnazivomLinearLayout,a
miemogazasadkoristitibezikakvihizmjena.UprojektHelloWorldautomatskijedodanjojedan
objekt namijenjen osnovnoj interakciji s korisnikom programa, to se zapravo svodilo na obian
prikaz pozdravne poruke. U terminologiji Google Androida, takvi objekti s vlastitim vizualnim
izgledom, namijenjeni izgradnji razliitih dijelova korisnikog suelja za interakciju s korisnikom
aplikacijenazivajusewidgets.

Vesmospomenulidaemoukorisnikosueljedodatijotridijelapasadprelazimonaizvoenje
odgovarajuih operacija. Iz prozora Views treba redom povui tri objekta na dio koji prikazuje
grafikureprezentacijuaplikacije(objektLinearLayout).Jednomtotrebanapravitisobjektomtipa
EditText,advaputasobjektomtipaButton.Osamommjestuisputanjaobjektanetrebavoditi
previerauna,jersepozicioniranjenacrtanihobjekataionakoizvodiautomatskizbogkoritenja
vrlo jednostavnog naina rasporeivanja objekata. Primijetimo na ovom mjestu da je razvojna
okolina nacrtanim objektima automatski dodijelila nazive (EditText01, Button01 i Button02), ba
kao i dio drugih vrijednosti svojstava. Ako ste ve ranije koristili neku inaicu Microsoftove
razvojneokoline,bitevampotpunojasnotosejedogodilouprethodnomkoraku.
Isto tako, prepoznat ete nain za pregled i izmjenu podrazumijevanih vrijednosti svojstava
aktivnogobjekta.ZatosekoristiprozorProperties,aunjemutrebajednostavnopronaisvojstvo
ijisadrajnamjeravamoizmijenititeupisati(iliizabratitoovisiovrstisvojstva)novuvrijednost.
Na primjer, ako elimo boju cjelokupne pozadine izmijeniti s crne na bijelu, kao aktivan objekt
treba oznaiti LinearLayout, a kao vrijednost svojstva Background upisati vrijednost #FFFFFF. Na
sliannainmoemogumbimaButton01iButton02izmijenitipoetnitekstnavrijednostPrihvati
odnosno Odbaci, tako da za svaki gumb izvedemo korekciju vrijednosti svojstva Text. Objektu
EditText01takoerizmijenimovrijednostsvojstvaLayoutwidthnaunaprijeddefiniranuvrijednost
fill_parent, kako bi se objekt proirio na punu irinu. Za vjebu, moete promijeniti poetnu
vrijednost prikazanog teksta na objektu EditText01, iako emo to kasnije napraviti programski,
kakobismodemonstriraliizmjenuvrijednostisvojstavauprogramskomjeziku.


Nestrpljivi itatelji mogu probati sami otkrivati emu slue druga dostupna svojstva tako da im
izmijenepoetnuvrijednosti,amiemousljedeimnastavcimaserijalaobjanjavatinekaodnjih
kad nam zatrebaju. Objasnimo na ovom mjestu neto zaobilazniji nain za izmjenu vrijednosti
svojstava.Vrijednost#FFFFFFnaprvi,drugipaakitreipogledpoetnikuneodajedajerijeo
bijelojboji,apriznatetedaniiskusnijimanijebalakopamtitislinevrijednosti,akoihnekoriste
svakodnevno. Postoji li nain da se takve vrijednosti koriste na humaniji nain? Sreom, da, a
odgovarajuipostupakopisujemounastavkuteksta.
Uhijerarhijskompregledudijelovaprojekta(prozorNavigator)trebapronaiiotvoritidatotekures
\ values \ strings.xml. U ovoj datoteci nalaze se definicije resursa uporabljenih na razliitim
mjestima u programu. Na ovo mjesto treba jednostavno dodati novi resurs pod nazivom
BijelaBoja. Za to se koristi klik na gumb Add.., nakon ega se otvara dijaloki okvir za odabir
kategorijeresursa.UnjemusasvimloginotrebaizabratikategorijuColor,iakosepotpunoslian
postupakprimjenjujezadrugevrste resursa. Preostaje josamo da sekao naziv resursa (Name)
upievrijednostBijelaBoja,akaonjegovavrijednost(Value)#FFFFFF.Naravno,nemojtezaboraviti
ninaspremanjenovevrijednostiresursapomouikonedisketenaalatnojtracirazvojneokoline.
Ako sada zatvorimo datoteku strings.xml, vraamo se ponovno na grafiku reprezentaciju
korisnikog suelja. Ponovno kao aktivni objekt izaberimo LinearLayout te pronaimo svojstvo
Background. Nakon klika na gumb s tri toke na samom desnom kraju reda, otvara se dijaloki
okvirReferenceChooser.UnjemumoemopronaivrijednostBijelaBojauokvirukategorijeColor
te je izabrati kao novu vrijednost svojstva, potvrdom na gumb OK. Kao nova vrijednost svojstva
sada e biti prikazana vrijednost @color/BijelaBoja, to i dalje predstavlja bijelu boju, ali sada
napisanu na mnogo itljiviji nain od upisa heksadecimalnoga koda iste boje. Na slian nain
moemodefiniratidrugevrijednostikojenamjeravamouporabitiurazliitimdijelovimaprograma.
Za kraj dananjeg nastavka, otvorimo ponovno datoteku main.xml, ali sada u obinome
tekstualnomeditoru.Dobitemonetopoput:

<?xmlversion=1.0encoding=utf8?>
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parentandroid:background=@color/BijelaBoja>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello
/>
<EditTextandroid:text=@+id/EditText01android:id=@+id/EditText01
android:layout_height=wrap_contentandroid:layout_width=fill_parent></EditText>
<Buttonandroid:id=@+id/Button01android:layout_height=wrap_content
android:onClick=myClickHandlerandroid:layout_width=wrap_content
android:text=Prihvati></Button>
<Buttonandroid:id=@+id/Button02android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:onClick=myClickHandler
android:text=Odbaci></Button>
</LinearLayout>

Sveonotosmoranijedobiligrafikimoblikovanjemsueljaunekolikoprozorarazvojneokoline,
ovdje je prikazano u obinom XML formatu zapisa. Iskusniji programeri mogu na ovom mjestu
izravno izvoditi promjene, pa ak i dodavanje novih objekata na suelje. Na primjer, probajte
jednostavnoumnoitidiotekstanamijenjendefiniranjugumbaButton02paetedobitijojedan
identiangumbnakorisnikomsuelju.

Primijetimo na kraju dananjeg nastavka da u XML opisu oba gumba postoji veza prema
programskomkoduzaobradudogaajaonClick,jerjeautortekstatovepripremiouprimjeru,ali
zbog zadane veliine svakog pojedinog nastavka serijala, o tome e neto vie rijei biti u
sljedeembroju.

4.Uvodupisanjeprogramskogkoda

U prolom, treem nastavku kole Google Android programiranja, u poetnu inaicu aplikacije
HelloWorlddodalismonekolikoosnovnihgrafikihobjekata,teusputobjasniliviebitnihdijelova
razvojne okoline Eclipse, povezanih s postavljanjem i pregledom grafikih objekata koritenih u
aplikaciji,odnosnopripremomiizmjenomnjihovihsvojstava.Meutim,takodugodoknacrtanim
objektimanedodamonekakavprogramskikod,oniuaplikacijisluemanjeviesamokaoukras,
pa kao takvi ne rade nita pametno. Tek kada se objektima pridrue odgovarajue funkcije za
reakcijuobjektanapodraajizokoline(recimopritisaknaobjektodstranekorisnikaaplikacije
nazaslonuureaja),poinjesedoistanetodogaati.
Vratimo se na trenutak ponovno na tekstualni prikaz dijela datotekemain.xml, zaduene za
definiranje izgleda objekata u aplikaciji, ali istovremeno i za povezivanje nacrtanih objekata s
dijelovimaprogramskogakoda.Usredotoimoseunastavkunasljedeedijelovedatoteke:
<?xmlversion=1.0encoding=utf8?>

<Buttonandroid:id=@+id/Button01
android:layout_height=wrap_contentandroid:onClick=myClickHandlerandroid:layout_width
=wrap_contentandroid:text=Prihvati></Button>
<Buttonandroid:id=@+id/Button02android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:onClick=myClickHandlerandroid:text=Odbaci
></Button>


Povezivanje objekata s programskim kodom: Izvedivo je izravnim ureivanjem tekstualnog
sadrajadatotekeMain.xml.
Dijelovioznaeniistaknutimpismomzaduenisuzapovezivanjeobanacrtanagumbausueljus
odgovarajuom funkcijom u programskom kodu u ovom sluaju ona je zaduena za obradu
dogaajaizazvanogpritiskomkorisnikanakontrolu.Daodmahrazjasnimojednuvrlobitnustvar
(kakoseitateljinebinaliusvojevrsnojkonfuzijipripraenjuteksta),iakosmojevespomenuli
nakrajuprethodnognastavka.Akosepozornopratilitekstizprologbrojatepokualiponovitisve
opisane operacije, onda u vaem projektu trenutnonemanavedenih dijelova. U projektu autora
teksta ti dijelovi postoje, jer je primjer prvo napravljen do kraja, a tek onda je zapoeto pisanje
teksta.Odatledolazidoistaknuterazlikeizmeuprojekata,aliemoodmahpoduzetisvepotrebne
operacijedaihuklonimo.
Nakojinainuvlastiteprojektemoetedodatidiokojinedostaje?Jedanodnainaizravnijeupis
prije oznaenoga teksta u prozoru zaduenom za tekstualni prikaz sadraja datoteke main.xml.
DruginainkoritenjejeprozoraProperties,nakontoeljeniobjektpostaneaktivanobjekt(vidi
priloenuslikuuztekst).Unaemprimjeruobaobjektapovezanasusistimdijelomprogramskog
koda, jer se u njemu na jedinstven nain prvo provjerava objekt na koji je korisnik programa
napravio pritisak. Mogue je napraviti i drugaije rjeenje. Svaki gumb moe biti povezan s
posebnomfunkcijomzaobradudogaaja.Naautoruprogramajeodluititojenajboljeizabratiu
odreenojsituaciji.
Pripadajui programski kod primjera u ovom trenutku ima sljedei oblik (datoteka
HelloWorld.java):
packagehelloWorld.java;
importandroid.app.Activity;

importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.EditText;
importandroid.os.Bundle;
publicclasshelloWorldextendsActivity{
privateEditTexttext;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text=(EditText)findViewById(R.id.EditText01);
text.setText(Nobuttonpressed);
}
//WillbeconnectedwiththebuttonsviaXML
publicvoidmyClickHandler(Viewview){
switch(view.getId()){
caseR.id.Button01:
text.setText(Button1wasclicked);
break;
caseR.id.Button02:
text.setText(Button2wasclicked);
break;
}
}
}

Uprethodnomprimjerumoguseuoititriglavnadijela.Prvojenavedenitavnizimportnaredaba
kakobiseuvlastitiprogramukljuilisvipotrebnidijelovizaizvoenjeaplikacije.Pomoudijela:
publicvoidonCreate(BundlesavedInstanceState){
zapoinje drugi dio, odnosno izvoenje glavnog dijela programa. U njemu se, osim inicijalizacije
same aplikacije, postavlja poetna vrijednost tekstualnog sadraja za trenutno jedini objekt u
aplikaciji zaduen za prikaz odnosno unos teksta (EditText01). Za to su zaduene naredbe za
njegovo pronalaenje meu postojeim objektima, a nakon toga za postavljanje poetne
vrijednosti.
setContentView(R.layout.main);
text=(EditText)findViewById(R.id.EditText01);
text.setText(Nobuttonpressed);
Kaotosmotovespomenuli,uovomprimjeruobagumbauaplikacijipovezanasunazajedniki
dioprogramskogakodazaobradudogaaja.

Alternativninainpovezivanja:KoritenjeprozoraPropertiesurazvojnojokoliniEclipse.
Pomounaredbeswitchprovjeravaseokojemjegumbudoistarije,aondaseizvodijedanoddva
moguanastavka.Svakiodnjihizazivaprikazdrugaijeporukeuprijespomenutomutekstualnom
okviru. Ako je sve napravljeno precizno, prema uputama iz ovog i prethodnog nastavka serijala,
tijekomizvoenjaprogramatrebalibistedobitiidentinoponaanjeprogramakaonaslikamauz
tekst.

Pokupajmosadausvrhusvojevrsnevjebeopisatisvepotrebneizmjenekakobiuprogramskom
kodu primjera svaki gumb imao vlastitu proceduru za obradu dogaaja. U praksi je to zapravo
ee rjeenje zbog velike razlike izmeu namjene pojedinih gumba u aplikaciji. Postojei
programskikodprimjerahelloWorld.javautomsluajutrebaizmijenitiusljedeioblik.
packagehelloWorld.java;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.EditText;
importandroid.os.Bundle;
publicclasshelloWorldextendsActivity{
privateEditTexttext;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text=(EditText)findViewById(R.id.EditText01);
text.setText(Nobuttonpressed);
}
//firstButton
publicvoidmyClickButton1(Viewview){
text.setText(Button1wasclicked);
}
//secondButton
publicvoidmyClickButton2(Viewview){
text.setText(Button2wasclicked);

}
}

Poetniizgledprozora:Nakonpokretanjaprogramapojavljujesepoetnaporuka.
Buduidazajednikafunkcijazaobradudogaajanakonpritiskanagumbvienepostoji,negoje
zamijenjenasdvijepojedinanefunkcije,trebakorigirativezeizmeuobagumbaipripadajuega
programskoga koda. To se ponovno moe napraviti izmjenom svojstvaOn clicku
prozoruPropertieste upisivanjem vrijednostimyClickButton1,odnosnomyClickButton2. Klikom
nagumbnakrajnjojdesnojstranitogaredamoeseprikazatiidijalokiokvirzaodabirpostojeih
dijelovaprogramskogakoda.Alternativninainzaizvoenjeisteoperacije(netobri,alizahtijeva
veupreciznostupisanju)izravnajeizmjenatekstualnogsadrajadatotekemain.xml.Ukonanici,
bezobziranauporabljeninainizmjenevrijednosti,utojdatotecitrebabitisljedeisadraj.
<?xmlversion=1.0encoding=utf8?>

<Buttonandroid:id=@+id/Button01android:layout_height=wrap_content
android:layout_width=wrap_content
android:text=Prihvatiandroid:onClick=myClickButton1android:scrollHorizontally=false></B
utton>
<Buttonandroid:id=@+id/Button02android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Odbaciandroid:onClick=myClickButton2></Button>


OvimejedovrenpoetniniztekstovaorazvojuaplikacijapomouGoogleAndroidplatforme.Ako
stepozornopratilisvetojedosadanapisanooovojtemi,sadabistenavlastitomraunalutrebali
imati pravilno instaliran razvojni sustav, a ujedno biste ga trebali poznavati do razine koritenja
koja omoguuje praenje i upis primjera iz sljedeih nastavaka serijala. Kao i obino u kolama
programiranja, praenje tekstova olakat emo izdavanjem prateih primjera na digitalnomu
medijuuzasopis.
to emo raditi u buduim nastavcima? Zbog relativne ogranienosti prostora za ovaj serijal u
asopisu,kolaprogramiranjaurazvojnomalatuGoogle

Izgledprozoranakonklikanaprvigumb:Poetnaporukazamjenjujesenovomporukom.
Android dalje e izgledati neto drugaije nego to je to bio sluaj s prethodnim slinim
materijalima istog autora. To znai da neemo obraivati segment po segment programskoga
jezika ni prateih biblioteka funkcija, a onda izmiljati odgovarajui primjer za njihovu
demonstraciju,negoemoraditiupravoobrnutimredoslijedom.Prvoemonapravitijedanilivie
sloenijihprimjeranamijenjenihdemonstracijirazliitihmogunostiGoogleAndroidplatforme,a
ondaobjasnititoradekljunidijeloviprimjera.Kaotosmoistaknulinasamompoetkuserijala,
za praenje tako koncipiranih nastavaka oekuje se odreeno predznanje u smislu poznavanja
osnovnih pojmova uobiajenih u programerskom argonu, poput varijable, petlje ili procedure.
Drugimrijeima,tobitrebaloznaitidaveposjedujeteosnovnopraktinoznanjeprogramiranjau
nekomdrugomrazvojnomalatu.
Umeuvremenu,dokekatesljedeibitnokompliciranijinastavakserijala,moetesamipokuati
dodatiuprojektnekolikonovihgumbailidrugaijihvrstakontrola,aondaihpovezatisosnovnim
dogaajemnakorisnikomsuelju(Onclick).

5.Koritenjerasporedakontrolausloenimaplikacijama

NakontosmoproliputdotjeralidokrajasnetosloenijimAndroidprojektomukojemjebilo
i malo vie programskog koda, doao je trenutak da se detaljnije pozabavimo najvanijim
dijelovima razvojnog alata, kako bi u slijedeim nastavcima mogli izraivati ozbiljnije aplikacije.
Jedna od tipinih karakteristika svake sloenije aplikacije, bez obzira na softversku platformu na
kojoj se izvodi, je postojanje veeg broja prozora, formi ili zaslona (ve prema terminologiji
uobiajenojzaturazvojnuplatformu)uokviruisteaplikacije.NiAndroidaplikacijepotompitanju
nisunikakavizuzetak.
Udosadanjadvajednostavnaprimjeraaplikacijaizprethodnihnastavakaserijalakoristilismoisti
pogled (odnosno istu vrstu rasporeda osnovnih objekata) pod nazivomLinearLayout. U tim
primjerima zapravo se nismo previe obazirali na karakteristike koritenog rasporeda kontrola,
negosmojednostavnoponjemupostaviliostaleobjektekoriteneuaplikaciji(dvagumbaijedan
okvir za unos teksta). Glavna tema dananjeg teksta posveena je upravo razliitim vrstama
rasporeda osnovnih kontrola dostupnim u okviru Android platforme, to ukljuuje opisivanje
njihovihmogunostiinainakoritenja.
UokviruGoogleAndroidplatformedostupnesuslijedeevrsterasporedaosnovnihobjekata:
1.
2.
3.
4.
5.
6.

LinearLayout
AbsoluteLayout
TableLayout
RelativeLayout
FrameLayout
ScrollView

Poetni raspored osnovnih kontrola: Koristi se podrazumijevani raspored osnovnih kontrola


LinearLayout.
Prije nego to malo detaljnije objasnimo svaki od rasporeda, posvetimo rije, dvije izvornoj
terminologiji te hrvatskim pojmovima koritenim u tekstu. U originalnoj terminologiji osnovni
objekti (npr. gumb, okvir za tekst i slino) nazivaju seWidget, a kad su vidljivi na zaslonuView.
PojmomViewGroup(u osnovi takoer posebnoj vrsti pogleda) oznaava se skupina osnovnih
Viewarazmjetenapozaslonuuodreenomrasporedutojeovih6rasporedaspomenutihu
prethodnom nabrajanju. Sad kad smo nabrojili temeljne engleske pojmove navedimo i to koje
emo prijevode koristi u nastavku teksta da ne stvaramo nepotrebnu zabunu. Umjesto pojmova
WidgetiViewkoristitemorijeiobjektilikontrola,dokeViewGroupbitizamijenjenspogledili
rasporedkontrola.Tomodanijenajboljemoguerjeenjeprijevoda,alisdrugestranepredstavlja
vrloestuterminologijukoritenuuopisudrugihrazvojnihalata.Akostevekoristilinekiodnjih,
bezproblemaetepratitireeniceutekstukojegupravoitate.
Vratimo se sada na glavnu temu dananjeg teksta koritenje razliitih rasporeda osnovnih
kontrolauvlastitimaplikacijama.Obavimotoistimredomkaouranijemnabrajanju.
LinearLayoutpredstavljaosnovnirasporedkontrolagdjesusveosnovnekontrolerasporeeneu
samojednomreduilisamojednomstupcu.Tijekomradanaosnovnadvaprojektauprethodnim
nastavcima,novekontrolesuseuvijekpojavljivalejednaispoddruge,jersmokoristiliupravotaj
osnovni raspored kontrola automatski predloen od strane razvojne okoline tijekom stvaranja
projekta.Iakozasloenijeaplikacijeovakavrasporedosnovnihkontrolanijeuvijekinajpogodnije
rjeenje,kodpoetnihkorakaunovomrazvojnomalatuzapravonemanekihprevelikihzamjerkina
njegovokoritenje.
KoddrugogodspomenutihrasporedakontrolaAbsoluteLayoutprogramernijeograniennaneki
odpodrazumijevanihoblikaredanjaosnovnihkontrolapopozadini,negoimapotpunusloboduu
njihovompostavljanju nadostupnompodruju.Osamimsvojstvima potrebnimzapozicioniranje
svakepojedinekontrolenaovakvojvrstipogledaodnosnorasporeda,bitevierijeislijedeiput.
Raspored kontrola pod nazivomTableLayout, kao to to sam naziv govori, koristi se kod
razvrstavanjaosnovnih kontrolauvieredovailistupacatablice,odnosnouelijetablice.Nataj
nain mogu se dobiti lijepi pravilni rasporedi osnovnih kontrola na pogledu, to se vrlo esto
koristikodrazliitihvrstaunosapodatakauaplikacijama.
URelativeLayoutrasporedukontrolesemogupostavitinarazliitamjestanadostupnomprostoru
za njihovo prikazivanje, ali tono mjesto svake kontrole nije odreeno njezinim apsolutnim
koordinatamakaokodrasporedapodnazivomAbsoluteLayout,negojepozicijaosnovnekontrole
definiranarelativnimkoordinatamapremadrugojosnovnojkontroli.
FrameLayoutse u aplikacijama koristi za rezerviranje mjesta za naknadno postavljanje drugih
kontrola tako da se one uvijek sidre prema gornjem lijevom uglu FrameLayout rasporeda
kontrola.Sveebitijasnijekadsetoprikaeslikomunekojodbuduihaplikacija.
ZadnjavrstarasporedaosnovnihkontrolapodnazivomScrollViewkoristiseusluajevimakadna
fizikimdimenzijamazaslonajednostavnonijemogueprikazatisvepotrebneosnovnekontrolena
smislen i pregledan nain (bez meusobnog preklapanja i jasnog razdvajanja). Pogled ScrollView
zapravo predstavlja posebnu vrstu rasporeda FrameLayout na koju se u praksi obino postavlja
dodatnavrstaosnovnograsporedakontrola(RelativeLayout).

U okviru jedne sloene aplikacije moe se koristiti vei broj istih ili razliitih vrsta rasporeda
kontrola,izmeukojihseprebacivanje,tojestaktiviranjenekogdrugograsporeda,izvodipomou
programskog koda. Pogledajmo sada kako koritenja razliitih rasporeda izgleda na nekoliko
primjera.
Osnovni raspored kontrola iz dovrenog primjera u prethodnom nastavku, koji je koristio
podrazumijevanirasporedLinearLayoutimaojeslijedeiXMLoblikazapisa.
<?xmlversion=1.0encoding=utf8?>
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parentandroid:background=@color/BijelaBoja>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello
/>
<EditTextandroid:text=@+id/EditText01android:id=@+id/EditText01
android:layout_height=wrap_contentandroid:layout_width=fill_parent>
</EditText>
<Buttonandroid:id=@+id/Button01android:layout_height=wrap_content
android:layout_width=wrap_contentandroid:text=Prihvati
android:onClick=myClickButton1android:scrollHorizontally=false>
</Button>
<Buttonandroid:id=@+id/Button02android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:text=Odbaciandroid:onClick=myClickButton2
>
</Button>
</LinearLayout>


Raspored kontrola AbsoluteLayout: Sve kontrole se preklapaju jer jo nisu upisane njihove
apsolutnekoordinate.
Ako u prethodnom XML kodu izmijenimo samo naziv rasporeda LinearLayout u AbsoluteLayout,
sve kontrole skupit e se u gornjem lijevom uglu prikaza, jer bi u ovakvom rasporedu trebalo
obaveznonavestiapsolutnevrijednostipozicijakontrola.Buduidatojouvijeknismonapravili,
uzetesupodrazumijevenevrijednosti0,tojeizazvalospomenutoskupljanjekontrola.
Navoenjem apsolutnih vrijednosti za poziciju i veliinu kontrola dolazi do njihovog eljenog
formatiranja,kaototopokazujeprateaslikauztekst.
<?xmlversion=1.0encoding=utf8?>
<AbsoluteLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parentandroid:background=@color/BijelaBoja>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello

/>
<EditTextandroid:text=@+id/EditText01android:id=@+id/EditText01
android:layout_x=40px
android:layout_y=50px
android:layout_width=400px
android:layout_height=50px>
</EditText>
<Buttonandroid:id=@+id/Button01
android:text=Prihvati
android:onClick=myClickButton1
android:layout_x=40px
android:layout_y=100px
android:layout_width=100px
android:layout_height=50px>
</Button>
<Buttonandroid:id=@+id/Button02
android:text=Odbaci
android:onClick=myClickButton2
android:layout_x=340px
android:layout_y=100px
android:layout_width=100px
android:layout_height=50px>
</Button>
</AbsoluteLayout>


Raspored kontrola AbsoluteLayout: Za svaku kontrolu su navedene apsolutne vrijednosti za
odreivanjeizgleda.
Zamjenom apsolutnog rasporeda kontrola relativnim u okviru XML definicije vie nije potrebno
navoditiapsolutnevrijednostipozicijakontrola,negosamonjihovurelativnupozicijuuodnosuna
neku drugu kontrolu. Apsolutne vrijednosti zaduene za definiranje veliine kontrole mogu se
koristitiidaljenaistinain.
Na temelju slijedeeg XML sadraja, pomou relativnog rasporeda kontrola oponaan je poetni
rasporedkontrolaLinearLayout.
<?xmlversion=1.0encoding=utf8?>
<RelativeLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parentandroid:background=@color/BijelaBoja>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello

/>
<EditTextandroid:text=@+id/EditText01android:id=@+id/EditText01
android:layout_alignParentTop=true
android:layout_alignParentLeft=true
android:layout_width=400px
android:layout_height=50px>
</EditText>
<Buttonandroid:id=@+id/Button01
android:text=Prihvati
android:onClick=myClickButton1
android:layout_alignLeft=@+id/EditText01
android:layout_below=@+id/EditText01
android:layout_width=100px
android:layout_height=50px>
</Button>
<Buttonandroid:id=@+id/Button02
android:text=Odbaci
android:onClick=myClickButton2
android:layout_alignLeft=@+id/EditText01
android:layout_below=@+id/Button01
android:layout_width=100px
android:layout_height=50px>
</Button>
</RelativeLayout>
U prethodna tri primjera koriteno je nekoliko dodatnih elemenata za definiranje rasporeda
osnovnihkontrolauokviruosvnovneXMLdatotekeza


RasporedkontrolaRelativeLayout:UovomsluajujeoponaanosnovnirasporedLinearLayout.
definiranjeizgledazaslona.Netovierijeionjihovojnamjenimoeteproitatiuslijedeem
broju.

6.KoritenjeosnovnihAndroidkontrola

Nakon to smo raspravili to su to zapravo rasporedi osnovnih kontrola, u dananjem nastavku


uvodauAndroidprogramiranjemoemoprijeinadrugibitanpreduvjetizradekorisnikogsuelja,
atojeupoznavanjeosnovnihkontrolanamijenjenihzapostavljenjenatakverasporede.No,prije
togaevojednogprimjeraprogramskogkoda(zakojegnijebilomjestauprolomnastavku),gdjese
korisnikosueljeupotpunostistvaraprogramskimkodom.
Drugim rijeima, ako je programeru iz nekog razloga tako zgodnije, ne mora prvo crtati
korisnikosueljeuodgovarajuemprozorurazvojneokoline,aondadodavatiprogramskikodda
oivi nacrtane kontrole, nego sve to moe napraviti u jednom prolazu iskljuivo programskim
kodom.AkosteveuprolostikoristiliMicrosoftVisualStudio,ondaevamsvebitimnogojasnije
kadnapiemodajerijeopostupkuanalognomdinamikomdodavanjukontrolanaformutijekom
izvoenjaprograma.
packageHello.Android;
importandroid.app.Activity;
importandroid.os.Bundle;

importandroid.view.ViewGroup.LayoutParams;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
publicclassHelloActivityextendsActivity
{
privateLinearLayoutprezimeime;
privateLinearLayoutadresa;
privateLinearLayoutpodloga;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
createPrezimeIme();
createAdresa();
createPodloga();
setContentView(podloga);
}
privatevoidcreatePodloga()
{
podloga=newLinearLayout(this);
podloga.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
podloga.setOrientation(LinearLayout.VERTICAL);
podloga.addView(prezimeime);
podloga.addView(adresa);

}
privatevoidcreatePrezimeIme()
{
prezimeime=newLinearLayout(this);
prezimeime.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
prezimeime.setOrientation(LinearLayout.HORIZONTAL);
TextViewprezimeLbl=newTextView(this);
prezimeLbl.setText(Prezimeime:);
TextViewprezime2Lbl=newTextView(this);
prezime2Lbl.setText(AndroidVid);
prezimeime.addView(prezimeLbl);
prezimeime.addView(prezime2Lbl);
}
privatevoidcreateAdresa()
{
adresa=newLinearLayout(this);
adresa.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
adresa.setOrientation(LinearLayout.VERTICAL);
TextViewadresaLbl=newTextView(this);
adresaLbl.setText(Adresa:);
TextViewadresa2Lbl=newTextView(this);
adresa2Lbl.setText(RedacijaVIDI);
adresa.addView(adresaLbl);
adresa.addView(adresa2Lbl);

}
}

Stvaranje rasporeda kontrola i samih kontrola pomou programskog koda: Ne treba uvijek prvo
nacrtatikontroleurazvojnojokolini.
Prethodni programski primjer tijekom svojeg izvoenja stvara osnovni raspored kontrola pod
nazivompodloga, a onda na njega dodaje tekstualne kontrole za prikaz imena i adrese. Slian
postupaksemoeprimijenitizasvevrstekontrola.Akonevoliteprekucavatiprimjere,moetega
pronainaprateemdigitalnommedijuuzasopis.
Vratimo se sada glavnom dijelu teksta kontrolama namijenjenim postavljanju na neki od
osnovnih rasporeda kontrola te njihovim najbitnijim svojstvima. Ako ste ve koristili neki od
modernijih razvojnih alata, ponovo ete pronai dosta slinosti, a ako niste, onda svakako
pogledajte tekst u nastavku te sami pokuajte napraviti nekoliko vlastitih primjera s takvim
kontrolama.Kontroleemounastavkuprikazatipremauestalostiuaplikacijamadakleprvoone
kojesenajeekoriste.

TextView
Kontrola tipa TextViewnamijenjena je prikazu razliitih vrsta tekstova na zaslonu, ali bez
mogunosti njihove izmjene odnosno ureivanja. Zato se ova vrsta kontrole u vlastitim
aplikacijama najee koristi za prikaz informacija korisniku poput dodatnih opisa uz glavne
kontrolekojeomoguavajuureivanjeteksta.Meutim,akodioprikazanogtekstapredstavljaweb
adresa,ondasekontrolamoeupotrijebitiznatnokreativnije,takodaklikmiemnawebadresu
otvarapreglednikteprikazujenjezinsadraj(vidiprimjerslikeuztekst).

Da bi demonstrirali takvo ponaanje kontrole TextView u prethodnom programskom primjeru


trebanapravitidvijeizmjene.Prvo,trebauaplikacijuukljuitiposebnuklasuzapronalaenjeveze
premavebadresiutekstualnomnizuznakova(klasaLinkify):
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
importandroid.text.util.Linkify;
aondadodatinovukontrolunazvanutxtWebijitekstualnisadrajukljuujewebadresu:
privatevoidcreatePodloga()
{
podloga=newLinearLayout(this);
podloga.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
podloga.setOrientation(LinearLayout.VERTICAL);
podloga.addView(prezimeime);
podloga.addView(adresa);
TextViewtxtWeb=newTextView(this);
txtWeb.setText(DodatneinformacijeoAndroidprogramiranjunahttp://www.vidilab.com/);
Linkify.addLinks(txtWeb,Linkify.ALL);
podloga.addView(txtWeb);
}
Nakon pokretanja programa, kao to to demonstrira pratea slika uz tekst, u sadraju kontrole
pojavljuje se posebno istaknuta web adresa, a klik na adresu otvara njezin sadraj u
podrazumijevanompregledniku.

EditText
Akojekorisnikupotrebnoomoguitidauprogramuupieodnosnodauredipostojeitekstualni
sadraj,ondaumjestokontroletipaTextViewtreba


KoritenjekontroleTextView:Omoguavaiotvaranjesadrajazadanewebadrese.
koristiti kontrolu tipa EditText. Treba istaknuti kako ni ova vrsta kontrole nije zamiljena za upis
velikihtekstova,negoprijesvegakraihpodatakakakviseobinozapisujuupojedinestupcebaze
podataka. Kontrola EditText posjeduje brojna dodatna svojstva ijom promjenom vrijednosti se
moebitnoizmijenitiponaanjekontrole,prijesveganainprikazateksta.Naprimjer:
Autotextautomatskiispravljamoguepogreketijekomupisateksta
Capitalizepretvaraupisanaslovauvelikaslova
Numericpostavljabrojaniunospodataka
Passwordpostavljaupislozinke(nevideseznakovikodupisa)
Phonenumberpostavljaunostelefonskogbroja
Singlelinedefiniraunostekstaujednomredu
Slijedeiprimjerpokazujedinamikododavanjetekstualnekontrolenaosnovnirasporedkontrola
uzkoritenjedvijedopunskemetodezaprikazdodatnihinformacijauzkontrolu.
privatevoidcreatePodloga()
{
podloga=newLinearLayout(this);
podloga.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));

podloga.setOrientation(LinearLayout.VERTICAL);
podloga.addView(prezimeime);
podloga.addView(adresa);
/*dodatak1primjerkoritenjakontroleTextView*/
TextViewtxtWeb=newTextView(this);
txtWeb.setText(DodatneinformacijeoAndroidprogramiranjunahttp://www.vidilab.com/);
Linkify.addLinks(txtWeb,Linkify.ALL);
podloga.addView(txtWeb);
/*dodatak2primjerkoritenjakontroleEditText*/
EditTexttxtKorisnik=newEditText(this);
txtKorisnik.setText(Upiitekorisnikoime);
txtKorisnik.setHint(Pazitenaupismalihivelikihslova);
txtKorisnik.setError(Pazitenaveliinuslova);
podloga.addView(txtKorisnik);
}

RezultatklikanawebadresuukontroliTextView:Prikazsadrajazadaneadreseupregledniku.
Posebnu
vrstu
kontrola
za
upis
teksta
predstavljaju
kontroleAutoCompleteTextViewteMultiAutoCompleteTextView. Njihova najvanija znaajka je
datijekomupisa/ispravljanjatekstaomoguavajuautomatskodovravanjeupisanogteksta.Evoi
primjera odgovarajueg programskog koda nadopisanog na kraj postojeeg programskog koda u
funkcijicreatePodloga.
privatevoidcreatePodloga()
{
podloga=newLinearLayout(this);
podloga.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
podloga.setOrientation(LinearLayout.VERTICAL);
podloga.addView(prezimeime);
podloga.addView(adresa);
/*dodatak1primjerkoritenjakontroleTextView*/
TextViewtxtWeb=newTextView(this);
txtWeb.setText(DodatneinformacijeoAndroidprogramiranjunahttp://www.vidilab.com/);
Linkify.addLinks(txtWeb,Linkify.ALL);
podloga.addView(txtWeb);
/*dodatak2primjerkoritenjakontroleEditText*/

PrimjerkoritenjakontroleEditText:Kontrolasekoristizaupisiizmjenuteksta.
EditTexttxtKorisnik=newEditText(this);
txtKorisnik.setText(Upiitekorisnikoime);
txtKorisnik.setHint(Pazitenaupismalihivelikihslova);
txtKorisnik.setError(Pazitenaveliinuslova);
podloga.addView(txtKorisnik);
/*dodatak3primjerkoritenjakontroleAutoCompleteTextView*/
AutoCompleteTextViewactv=newAutoCompleteTextView(this);
ArrayAdapter<String>aa=newArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
newString[]{English,Hebrew,Hindi,Spanish,German,Greek});
actv.setAdapter(aa);
podloga.addView(actv);
}

Nakon upisa poetnih slova (npr. en) automatski se predlae podudarajua potpuna tekstualna
vrijednost,paseonanakontogamoejednostavnoizabratiumjestodaseupisujeucijelosti.

Buttons
Androidplatformaomoguavakoritenjetrirazliitatipagumbiosnovnigumb(ButtonControl),
gumbsaslikom(ImageButtonControl)tegumbsmogunouprikazadvarazliitastanjagumba
(ToggleButtonControl).Osnovnitipgumbavesmokoristiliuprimjerimaizprethodnihnastavaka
serijala,adetaljnemogunostikoritenjasvatritipagumbipredstavitemouslijedeemnastavku
serijalazajednosostatkomosnovnihkontrola.

7.Androidprogramiranje

SpredstavljanjemosnovnihAndroidkontrolaproliputsmozastalinadobropoznatimgumbima
(Buttons). Kao i u drugim modernim operativnim sustavima ovaj tip kontrole koristi se u
aplikacijama za izvoenje razliitih operacija, a (ponovo kao i u drugim operativnim sustavima)
moeimatinekolikopojavnihoblika.
Osnovnioblikgumba(Button)nasebisadrisamoobiantekstkojioznaavakakvueoperacijuu
okviruodreeneaplikacijeizazvatipritisaknagumb.Akozadnjihnekolikodesetljeanisteproveli
izolirani u samici nekog zaostalog nedemokratskog reima bez ikakvog kontakta s modernim
raunalima,ondajeprethodnareenicasasvimdovoljnadashvatiteoemujeovdjerije.Budui
dasmoovajgumbvenekolikoputakoristiliuprimjerimaizprethodnihnastavakaserijala,kakou
pogledu izmjene osnovnih svojstava, tako i u pogledu dodavanja programskog koda, neemo se
vienibavitinjime.
Buduidasemodernakorisnikasueljasvevietemeljenaslicinegonarijei,razumljivodaje
obian gumb doivio svojevrsnu vizualnu nadogradnju, postavi tako u Android terminologiji
kontrola pod nazivom ImageButton. Namjena unaprijeene kontrole je potpuno jednaka kao i u
njezinomosnovnomobliku,jedinototakavgumbmoeizgledatibitnoljepe(toizravnoovisio
slicipostavljenojnanjegovupovrinu).Upravojezamjenaosnovnihvrstagumbislikovnimjedan
odnajvanijih,aliujednoinajjednostavnijihnainadavlastituaplikacijuuiniteatraktivnijomteu
konanici privlanijom potencijalnim korisnicima. Slikovna verzija gumba povezuje se s
odgovarajuomdatotekomsgrafikimsadrajempomousvojstvasrc,tosemoenapravitiuza
to namijenjenom prozoru razvojne okoline, izravno u XML datoteci, ili programskim kodom. U
priloenoj segmentu XML datoteke prikazan je primjer koritenja drugog od nabrojenih naina,
doksezaistunamjenuuprogramskomkodutrebakoristitimetodasetImageResource().
Trea vrsta gumba pod nazivom ToggleButton omoguava prikaz vie stanja iste pojave unutar
aplikacije.Naprimjer,jednimstanjemgumbamoesepokazatidajeukljuennekakavparametar
odnosnoizvoenjenekakveoperacije,adrugimstanjemdajeparametariskljuenodnosnodaje
prekinuto izvoenje operacije. U praksi se takva vrsta gumbi najee koristi za prilagoavanje
razliitihdijelovaaplikacijeeljamaipotrebamakorisnikaaplikacije.Kaototoponovoprikazuje
priloenaXMLdatotekasadefinicijamasvetrivrsteopisanihgumbi,pomoudvadodatnasvojstva
gumba android:textOn=Pokrenuto android:textOff=Zaustavljeno> mogue je definirati dva

razliitatekstualnasadrajazaprikazivanjenasamomgumbuovisnoonjegovomtrenutnomstanju
(ukljueno/iskljueno).
<?xmlversion=1.0encoding=utf8?>
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello
/>
<Buttonandroid:id=@+id/Button01android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:text=Tekstgumb></Button>
<ImageButtonandroid:id=@+id/ImageButton01android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:src=@drawable/icon></ImageButton>
<ToggleButtonandroid:text=@+id/ToggleButton01android:id=@+id/ToggleButton01
android:layout_width=wrap_contentandroid:layout_height=wrap_content
android:textOn=Pokrenutoandroid:textOff=Zaustavljeno></ToggleButton>
<RadioButtonandroid:id=@+id/RadioButton01android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:text=Opcija1
android:checked=true></RadioButton>
<RadioButtonandroid:id=@+id/RadioButton02android:layout_width=wrap_content
android:layout_height=wrap_contentandroid:text=Opcija2
android:checked=false></RadioButton>
</LinearLayout>
Kako izgleda korisniko suelje nastalo na temelju prethodne XML datoteke moete vidjeti na
priloenojsliciuzdananjitekst.
Zadnjoj od prije opisanih kontrola prilino sline su jo dvije vrste kontrola. To suCheckBox i
RadioButton.Rijejeokontrolamakojesuzapravoipoznatijekorisnicimaaplikacija,jersuosimna

Android platformi prisutne u praktino svim modernim grafikim sueljima dananjice. Obje od
navedenih kontrola omoguavaju ukljuivanje/iskljuivanje razliitih opcija, ali se meusobno
razlikuju u situacijama kad u korisnikom suelju aplikacije postoji vie kontrola istog tipa.
CheckBox kontrole su u pogledu meusobnog stanja neovisne jedne od druge, to znai da
ukljuivanjeiliiskljuivanjejedneodkontrolaneutjeenastanjedrugekontrole.Osimpromjene
trenutnog stanja od strane krajnjeg korisnika aplikacije, vrijednosti se mogu postavljati
programskim kodom koritenjem metode setChecked() dok se trenutno stanje moe dobiti
pomouisChecked().
Trenutno stanje neke RadioButton kontrole ovisi o stanju drugih kontrola iste vrste, to drugim
rijeimaznaidaujednomtrenutkusamojednaodtakvihkontrolamoebitiukljuena,doksve
druge kontrole automatski poprimaju vrijednost iskljueno. Zato se ova vrsta kontrola koristi za
rad s vrijednosti koje se meusobno iskljuuju. Sa stanovita programskog koda
ukljuivanje/iskljuivanjestanjakontroleprovodisenasliannainkaoikodCheckBoxkontrola.
Spomenimo na ovom mjestu i to da se pojam meusobnog iskljuivanja RadioButton kontrola
odnosinakontroleuistomspremnikukontrola.Akouaplikacijitrebajupostojatidvijeneovisne
grupetakvihkontrola,ondatrebapripremitiidvaspremnika(npr.rasporedakontrola).
EvokratkogsegmentaXMLdatotekenamijenjenogdefiniranjuobijuvrstakontrola.
CheckBoxkontrole:
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=verticalandroid:layout_width=fill_parent
android:layout_height=fill_parent>:BuildingUserInterfacesandUsingControls
<CheckBoxandroid:text=Juha
android:layout_width=wrap_contentandroid:layout_height=wrap_content/>
<CheckBoxandroid:text=GlavnoJelo
android:layout_width=wrap_contentandroid:layout_height=wrap_content/>
<CheckBoxandroid:text=Desert
android:layout_width=wrap_contentandroid:layout_height=wrap_content/>
</LinearLayout>

RadioButtonkontrole:

Koritenjegumbi:Programerusunaraspolaganjutrirazliitevrstegumbi.
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=verticalandroid:layout_width=fill_parent
CHAPTER4:BuildingUserInterfacesandUsingControls137
android:layout_height=fill_parent>
<RadioGroupandroid:id=@+id/rBtnGrpandroid:layout_width=wrap_content
android:layout_height=wrap_content
android:orientation=vertical>
<RadioButtonandroid:id=@+id/pRBtnandroid:text=Piletina
android:layout_width=wrap_content
android:layout_height=wrap_content/>
<RadioButtonandroid:id=@+id/sRBtnandroid:text=Svinjetina
android:layout_width=wrap_content

android:layout_height=wrap_content/>
<RadioButtonandroid:id=@+id/gRBtnandroid:text=Govedina
android:layout_width=wrap_content
android:layout_height=wrap_content/>
</RadioGroup>
</LinearLayout>
Uizmiljenojaplikacijizanaruivanjeurestoranuuprvomsluajukorisnikaplikacijemoeoznaiti
razliite dijelove obroka neovisno jedan o drugome, a u drugom sluaju za glavni obrok moe
izabratisamojednuodvrstaglavnogjela(mesa).
Nekolikorijeiohardveru
Dozvolite da na kraju dananjeg nastavka softverskog serijala napiemo par rijei o dosta
zanimljivomhardverskomureajuEkenM001.Rijejeo7innomureajusugraenomGoolge
Android platformom u verziji 1.6, te dobrim mogunostima proirivanja i povezivanja s obinim
raunalom.Usluajudapripadategrupiprogramerakojazavrnotestiranjevlastitogsoftveraeli
provesti na pravom hardveru, a ne samo njegovom simulatoru, teko da ete proi jeftinije.
Hardvernabrojenuslijedeojtablicimoetedobitipocijenimanjojod100dolara,azanimljivoje
daseureajmoepronaiakipodomaimmalimoglasnicima.

EkenM001:VrlojeftinihardversimplementacijomGoogleAndroidplatforme.
U posljednje vrijeme domai operateri mobilnih usluga poeli su nuditi podosta naprednije
ureaje od navedenog. Ako odaberete odgovarajui pretplatniki odnos moete proi ak i
jeftinije,alinesmijetezaboravitidavaspretplatnikiodnosveenaindirektnoplaanjeureajana
najmanje godinu ili dvije dana. S druge strane nabavkom M001, dobivate sasvim upotrebljivi
ureajzaitanjerazliitihmaterijalaspremljenihizravnounjegovumemorijuilipristupompreko
Wifi mree, igranje, reprodukciju multimedijalnih sadraja i jo poneto. Nije iPod, ali iz daljine
nitkotoneeniprimijetiti.
Premaiskustvimaautoratekstanajvanijinedostatakureajajeprilinoskromnotrajanjebaterija
pabuditespremnidaosimsasobomstalnonositeiispravljazanjegovonadopunjavanje.

8.AndroidkontroleuakcijiIV

Vrlo vaan dio gotovo svake aplikacije (osim onih krajnje trivijalnih, ili onih koje su potpuno
optimizirane za neko specijalizirano podruje) je upravljanje vremenom. ak i razliite igre, kao
kategorijaaplikacijakakvesevrloestopiuzamobilneureajeukljuujuiiAndroidplatformu,
esto spremaju razliite podatke o igrau ili statusu igre povezane s datumom i vremenom.
Naravno, za prikaz ili izmjenu datuma i vremena programer uvijek moe izmisliti svoje vlastite
kontrole, ali nije loe kad je i osnovni razvojni sustav opremljen odgovarajuim kontrolama. To
posebnovrijedikodaplikacijasnaglaskomnafunkcionalnosti,anenavizualnojraskoi.
Androidplatformaopremljenajesdvijemeusobnoprilinorazliitevrstekontrolazatunamjenu.
Prvagrupakontrolamoesamoprikazatipodatkeovremenu,dokihdrugavrstamoeprikazati,ali
i dozvoliti izmjenu vrijednosti od strane krajnjeg korisnika aplikacije. U prvu grupu kontrola
pripadaju kontroleAnalogClockiDigitalClock(sam naziv u potpunosti govori o emu je rije).
Glavninedostatakimjeodreenveprijespomenutomnamjenom(prikazompodataka),paseu
praksi koriste neto rjee, osim ako je dovoljno da kontrola zaista samo prikazuje datum ili
vrijeme. Zato se s navedene dvije kontrole vie neemo baviti. Ako njihova ogranienja
zadovoljavaju vae planove u izradi aplikacija, jednostavno ih postavite na neki od standardnih
rasporedakontrolaizaboravitenanjih.

Usluajudajepotrebnoomoguitinekakavoblikinterakcijekorisnikaaplikacijeupogleduodabira
datuma i/ili vremena, onda je bolje upotrijebiti kontrole pod nazivomDatePickeriTimePicker.
Njihovopostavljanjenaosnovnirasporedkontrolamoesenapravitipremaslijedeemprimjeru.
<?xmlversion=1.0encoding=utf8?>

<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent>
<DatePickerandroid:id=@+id/datePicker
android:layout_width=wrap_contentandroid:layout_height=wrap_content/>
<TimePickerandroid:id=@+id/timePicker
android:layout_width=wrap_contentandroid:layout_height=wrap_content/>
</LinearLayout>
Prva (gornja) kontrola zaduena je za prikaz, odnosno odabir datuma, a donja to isto radi s
vremenom, kao to se to moe provjeriti na priloenoj slici uz tekst. Kad se tome pridoda
programskikodnavedenunastavkuzaduenzapodeavanjepoetnihvrijednostikontrola,dobije
se sasvim funkcionalno korisniko suelje. Najvei nedostatak ove grupe kontrola je njihova
relativnanezgrapnost.Drugimrijeimajednostavnosuprevelikezaintenzivnokoritenje,naroito
ako koristite ureaj s relativno skromnom rezolucijom zaslona. Ako to predstavlja nepremostivu
preprekumoetesesnaiisamitenapravitivlastiteibitnomanjekontrole.
packageHello.Android;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.DatePicker;
importandroid.widget.TimePicker;
publicclassHelloActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

DatePickerdp=(DatePicker)this.findViewById(R.id.datePicker);
dp.init(2010,11,13,null);
TimePickertp=(TimePicker)this.findViewById(R.id.timePicker);
tp.setIs24HourView(true);
tp.setCurrentHour(newInteger(10));
tp.setCurrentMinute(newInteger(10));
}
}

Koritenjeizbornika
Osim sasvim jednostavnih uradaka veina aplikacija podrava neki oblik sustava izbornika
namijenjenizborusvihoperacijakojenudiaplikacija.NiAndroidplatformapotomenijenikakav
izuzetak.Zapravomoglibireidavrijediaksuprotnoprogramerujenaraspolaganjunekoliko
razliitih sustava izbornika, a na njemu je odlui koji od njih najvie odgovara potrebama
konkretne aplikacije. Dok ste neke od dostupnih sustava izbornika ve susretali na drugim
operativnimsustavimauvrloslinomobliku,Androidnudiinekenovostinaovompodruju,zbog
egaemoseizbornicimapozabavitiudvabrojaasopisa.
Po obiaju kreemo od najjednostavnijeg oblika izbornika, za iju pojavu u aplikaciji je zaduen
iskljuivoprogramskikodnaliknaonajpridodannakrajprethodnogprojektazaprikazdatumskii
vremenski orijentiranih kontrola (funkcijaonCreateOptionsMenu). Navedeni naziv funkcije je
obavezaniujednopovezansodgovarajuomaktivnostiuprogramu.
packageHello.Android;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.widget.DatePicker;
importandroid.widget.TimePicker;
publicclassHelloActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState)

{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DatePickerdp=(DatePicker)this.findViewById(R.id.datePicker);
dp.init(2010,11,13,null);
TimePickertp=(TimePicker)this.findViewById(R.id.timePicker);
tp.setIs24HourView(true);
tp.setCurrentHour(newInteger(10));
tp.setCurrentMinute(newInteger(10));
}
publicbooleanonCreateOptionsMenu(Menumenu)
{
super.onCreateOptionsMenu(menu);
menu.add(0//Group
,1//itemid
,0//order
,append);//title
menu.add(0,2,1,edit);
menu.add(0,3,2,clear);
returntrue;
}
}
Rezultat izvoenja dodatnog programskog koda su tri opcije izbornika, koje se pojavljuju na
samomdnuzaslona).Kaototopokazujeprethodniprimjerdodavanjesvakeodopcijaizbornika
zahtijeva navoenje etiri parametra.To su redom oznaka grupe, oznaka opcije izbornika,
redoslijed opcije u okviru izbornika, te tekst koji se prikazuje na samoj opciji izbornika. Prve tri
opcije su brojane, a etvrta je iz sasvim razumljivih razloga tekstualna. Zadnja od nabrojenih
opcijamoeseuprogramskomkoduzageneriranjeizbornikazadatiizravno,kaotojetosluaju

prethodnom primjeru, ili se odgovarajua vrijednost moe unaprijed pripremiti u resursnoj


datoteci. Istaknimo kako nije uvijek potrebno navoditi ba sve brojane vrijednosti, nego se
umjestonjihmoeupotrijebitivrijednostMenu.None.
Ako je potrebno opcije izbornika u aplikaciji grupirati u vie od jedne grupe, onda se to rjeava
navoenjemrazliitihoznakagrupeprilikomzadavanjanaredbizastvaranjeopcijaizbornika.Takva
podjela izbornika na dvije grupe prikazana je u slijedeem segmentu programskog koda, kojeg
trebaumetnutiuprogramumjestoistoimenefunkcijeizprethodnogkompletnog primjerakoda.
Kakoeizgledatidobijenirezultatmoesevidjetinapriloenojsliciuztekst.
publicbooleanonCreateOptionsMenu(Menumenu)
{
//Group1
intgroup1=1;
menu.add(group1,1,1,g1.item1);
menu.add(group1,2,2,g1.item2);
//Group2
intgroup2=2;
menu.add(group2,3,3,g2.item1);
menu.add(group2,4,4,g2.item2);
returntrue;
}
Kaotosmotoveobjasniliranije,prethodnenaredbeizazivajusamoprikazizbornikanazaslonu
ureaja, ali pritisak na te izbornike trenutno ne izaziva ba nikakvu reakciju, jer jednostavno
nedostajeodgovarajuegprogramskogkodazatunamjenu.Tojetemakojomemosepozabaviti
u slijedeem broju, ba kao i dodavanjem slika na opcije izbornika, kako bi se postigao to bolji
vizualnidojamuvlastitojaplikaciji.
U ostatku dananjeg teksta navest emo karakteristike preostalih vrsta izbornika dostupnih na
Android platformi. Prva vrsta su takozvaniproireni izbornici. Ova vrsta izbornika nastaje
automatski, ako programer pretjera s brojem opcija osnovnog izbornika. U tom sluaju se kao
opcija izbornika automatski prikazuje vrijednostMore, a njezinim odabirom korisnik aplikacije
moe stii do poetno skrivenih opcija izbornika. Jedno od ogranienja proirenih izbornika je u
tome to ne dozvoljavaju prikaz slike, pa zato prilikom pripreme izbornika treba paziti da se na
istommjestuuaplikacijinepojaveitrenjeivinje,tojestopcijeizbornikasaslikamaionebez
slika.

Kod dodavanja ikona na opcije izbornika u igri je jo nekoliko dodatnih ogranienja osim onog
spomenutoguprethodnomodjeljku.Naopcijiizbornikasikonomnemoebitiprikazanaoznaka
njezinog izbora (kvaica), a ako je tekst opcije izbornika neto dui, onda e biti prikazan samo
poetni dio. To i nije nelogino ako odaberete ikonu koja vrlo reprezentativno oznaava neku
operaciju,zatobijeondanairokoiopisivali.Prednostitakvogpristupakodstvaranjaviejezinog
sueljanetrebamoposebnoniisticati.

Usluajuvrloirokograsponamoguihoperacijauaplikaciji,neke(ilisve)opcijeizbornikamogu
imati svojepodizbornike. Opcije podizbornika dodaju se programski odgovarajuim metodama
to emo prikazati u slijedeem nastavku. Za sada istaknimo kako i ova kategorija izbornika ne
podravaprikazikona,iakoseformalnonejavljajunikakvegrekakodtakvogpokuaja.
Izbornici ovisni o kontekstupredstavljaju posebnu vrstu izbornika iji izgled se mijenja ovisno o
smislu izvoenja pojedinog dijela aplikacije, a aktiviraju se takozvanimdugim pritiskom na neki
element korisnikog suelja. Programer moe u vlastitu aplikaciju dodati i standardnesistemske
izbornike.Kakosetoradi,takoeremodemonstriratislijedeiput.

9.Koritenjedatotenogsustava
Nakontosmouprolomnastavkupokazalikakosestvaraosnovnavrstaizbornika,danasemo
objasniti kako program na najednostavniji mogui nain putem izbornika odgovara na akcije
korisnika.Ujednoemoodovomjesenognastavkanapravitimaloubrzanjeuizlaganjukakobiu
planiranom broju preostalih nastavaka mogli doista i napraviti nekakvu malo sloeniju
aplikaciju.Ideja je da izloenu materiju prikaemo na meusobno povezani nain, kako nakon
prolaska kroz itav serijal ne bi imali niz nepovezanih segmenata znanja o pojedinim dijelovima
AndroidSDKsustava,alibezmogunostinjihovogslaganjausmislenucjelinu.Sdrugestrane,na
temeljudosadanjihnastavakavienebitrebaliimatiprevieproblemastimdapronaetegdjese
umeu pojedini dijelovi programskog koda. Zato na ovom mjestu neemo izloiti sve mogue
naine stvaranja izbornika i hvatanja operacija korisnika, jer ih ima zbilja podosta, pa bi se
izlaganjehtjelimitoiline,lakopretvorilouprepisivanjeoriginalnihuputa.Umjestotogaemou
sloenijojaplikacijikojusmomaloprijenajavilipokazatibrojnedodatnemogunostiukoritenju.
Osnovni oblik reakcije izbornika na djelovanje korisnika priprema se u dva koraka prema
slijedeem obrascu. U prvom koraku treba implementiratiOnMenuClickListenersuelje. U
drugom koraku, koji se izvodi nakon izbora neke od opcija od strane korisnika, poziva se
metodaonMenuItemClick().Tojeujednomjestogdjeseizvodistvarnaobradadogaajapritiska
nanekuodopcijaizbornika.
//korak1
publicclassMyResponseimplementsOnMenuClickListener
{
//
@override
booleanonMenuItemClick(MenuItemitem)
{
//izvoenjeoperacije
returntrue;
}
}
//korak2
MyResponsemyResponse=newMyResponse();
menuItem.setOnMenuItemClickListener(myResponse);


Osim osnovnog naina reakcije izbornika na dogaaje postoji jo nekoliko varijanti koje emo
demonstriratinasloenijojaplikaciji.Unjojemoujednopokazatikakoseizvornicimogustvoriti
prekoodgovarajueresursneXMLdatoteke,anesamoprogramskimkodom.

Radsdatotekama
Svakamalosloenijaaplikacija,kojarukujeskorisnimpodacima,moraimatimogunostspremanja
podataka iz aplikacije u neko spremite te njihovo vraanje kad se za tim ukae potreba. U
dananjemnastavkupokazatemokakosenavedenedvijeoperacijeizvodepomoudatotenog
sustava ugraenog u Android SDK. Za to emo koristiti dva specijalizirana tijeka podataka
FileOutputStreamiFileInputStream. Prvi se koristi za prijenos podataka na relaciji program
datoteka, adrugi u obrnutom smjeru. Ujedno emo pokazati dvije dodatne nune operacijekod
takvogpostupka.PrvajeskupljanjetrenutnihvrijednostirazliitihAndroidkontrolaupisanihod
strane korisnika aplikacije kako bi se imalo to upisati u datoteku, a druga je njihovo ponovno
vraanjeizdatotekeipostavljanjenaodgovarajuukontrolu.
Pogledajmoprvokakoseizvodispremanjepodatakaudatotekunasegmentuprogramskogkoda
izvaenog iz jedne manje medicinski orijentirane aplikacije. U ovom trenutku zapravo i nije
previebitnookakvimsepodacimaradi.Primijetimosamodasepodacineskupljajuiskljuivoiz
tekstualnih nego i iz drugih oblika kontrola, a prije samog spremanja u datoteku se grupiraju u
jedansloenijinizznakova.Unjemusupodacimeusobnoodvojeniposebnimnizomznakovaza
odvajanje,kakobiseolakalonjihovoobnavljanjekodsuprotneoperacijeitanjaizdatoteke.

Spremanje podataka iz aplikacije: Prethodni primjeri koda odnose se na jednostavnu medicinski


orijentiranuaplikaciju.
privatevoidSpremiPodatkeCritical2()throwsIOException
{
StringFILENAME=PrvaPomocCritical2;
Stringstring=;
FileOutputStreamfos;
try
{
finalEditTexttmp=(EditText)findViewById(R.id.txtSpol);
Stringtmps=tmp.getText().toString();
if(tmps.length()==0)tmps=!!!;
finalEditTexttmp2=(EditText)findViewById(R.id.txtTezina);
Stringtmps2=tmp2.getText().toString();
if(tmps2.length()==0)tmps2=!!!;
finalEditTexttmp3=(EditText)findViewById(R.id.txtKrvnaGrupa);
Stringtmps3=tmp3.getText().toString();
if(tmps3.length()==0)tmps3=!!!;
finalEditTexttmp4=(EditText)findViewById(R.id.txtRhFaktor);
Stringtmps4=tmp4.getText().toString();
if(tmps4.length()==0)tmps4=!!!;
finalCheckBoxtmp5=(CheckBox)findViewById(R.id.chkSida);
Stringtmps5=N;
if(tmp5.isChecked())tmps5=D;
finalCheckBoxtmp6=(CheckBox)findViewById(R.id.chkHepatitisC);
Stringtmps6=N;

if(tmp6.isChecked())tmps6=D;
finalCheckBoxtmp7=(CheckBox)findViewById(R.id.chkDonator);
Stringtmps7=N;
if(tmp7.isChecked())tmps7=D;
finalEditTexttmp8=(EditText)findViewById(R.id.txtAlergija);
Stringtmps8=tmp8.getText().toString();
if(tmps8.length()==0)tmps8=!!!;
finalEditTexttmp9=(EditText)findViewById(R.id.txtDijagnoza);
Stringtmps9=tmp9.getText().toString();
if(tmps9.length()==0)tmps9=!!!;
finalEditTexttmp10=(EditText)findViewById(R.id.txtTerapija);
Stringtmps10=tmp10.getText().toString();
if(tmps10.length()==0)tmps10=!!!;
finalEditTexttmp11=(EditText)findViewById(R.id.txtNapomena);
Stringtmps11=tmp11.getText().toString();
if(tmps11.length()==0)tmps11=!!!;
string=tmps+###+tmps2+###+tmps3+###+tmps4+###+tmps5+###+tmps6+
###+tmps7+###+tmps8+###+tmps9+###+tmps10+###+tmps11;
fos=openFileOutput(FILENAME,Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
}
catch(FileNotFoundExceptione){
e.printStackTrace();
}
}

Istaknimovrlovanuinjenicukojusvakakotrebauzetiuobzirkodradasdatotenimsustavom,a
tojemogunostpojavegreke.Osnovniniznaredbizazapispodatakaudatoteku:
fos=openFileOutput(FILENAME,Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
moeponekaddovestidopojavegreke,akonizbogegadrugogondazbognedostatkaprostora
na mediju na kojem se nalazi datoteni sustav. Kako se aplikacija u tom sluaju ne bi poela
nekontroliranoponaati,trebaugraditibarosnovnimehanizamobradepogrekeuvlastitomkodu,
tojeovdjeinapravljenokoritenjemstandardnetry..catchstrukture.
Pogledajmosadakakosekoristisuprotnitijekpodatakanamijenjenitanjuspremljenihpodataka.
privatevoidVratiPodatkeCritical2()throwsIOException
{
StringFILENAME=PrvaPomocCritical2;
Stringstring1=;
setContentView(R.layout.critical2);
FileInputStreamfis;
try
{
fis=openFileInput(FILENAME);
BufferedReaderbuf=newBufferedReader(newInputStreamReader(fis));
string1=buf.readLine();
String[]list=TextUtils.split(string1,###);
finalEditTexttmp=(EditText)findViewById(R.id.txtSpol);
if(list[0].matches(!!!))list[0]=;
tmp.setText(list[0]);
finalEditTexttmp2=(EditText)findViewById(R.id.txtTezina);
if(list[1].matches(!!!))list[1]=;

tmp2.setText(list[1]);
finalEditTexttmp3=(EditText)findViewById(R.id.txtKrvnaGrupa);
if(list[2].matches(!!!))list[2]=;
tmp3.setText(list[2]);
finalEditTexttmp4=(EditText)findViewById(R.id.txtRhFaktor);
if(list[3].matches(!!!))list[3]=;
tmp4.setText(list[3]);
finalCheckBoxtmp5=(CheckBox)findViewById(R.id.chkSida);
tmp5.setChecked(false);
if(list[4].matches(D))tmp5.setChecked(true);
finalCheckBoxtmp6=(CheckBox)findViewById(R.id.chkHepatitisC);
tmp6.setChecked(false);
if(list[5].matches(D))tmp6.setChecked(true);
finalCheckBoxtmp7=(CheckBox)findViewById(R.id.chkDonator);
tmp7.setChecked(false);
if(list[6].matches(D))tmp7.setChecked(true);
finalEditTexttmp8=(EditText)findViewById(R.id.txtAlergija);
if(list[7].matches(!!!))list[7]=;
tmp8.setText(list[7]);
finalEditTexttmp9=(EditText)findViewById(R.id.txtDijagnoza);
if(list[8].matches(!!!))list[8]=;
tmp9.setText(list[8]);
finalEditTexttmp10=(EditText)findViewById(R.id.txtTerapija);
if(list[9].matches(!!!))list[9]=;
tmp10.setText(list[9]);

finalEditTexttmp11=(EditText)findViewById(R.id.txtNapomena);
if(list[10].matches(!!!))list[10]=;
tmp11.setText(list[10]);
fis.close();
}
catch(FileNotFoundExceptione)
{
finalEditTexttmp=(EditText)findViewById(R.id.txtSpol);
tmp.setText($_);
finalEditTexttmp2=(EditText)findViewById(R.id.txtTezina);
tmp2.setText(___);
finalEditTexttmp3=(EditText)findViewById(R.id.txtKrvnaGrupa);
tmp3.setText(__);
finalEditTexttmp4=(EditText)findViewById(R.id.txtRhFaktor);
tmp4.setText(_);
finalCheckBoxtmp5=(CheckBox)findViewById(R.id.chkSida);
tmp5.setChecked(false);
finalCheckBoxtmp6=(CheckBox)findViewById(R.id.chkHepatitisC);
tmp6.setChecked(false);
finalCheckBoxtmp7=(CheckBox)findViewById(R.id.chkDonator);
tmp7.setChecked(true);
finalEditTexttmp8=(EditText)findViewById(R.id.txtAlergija);
tmp8.setText($Alergija);
finalEditTexttmp9=(EditText)findViewById(R.id.txtDijagnoza);
tmp9.setText($Dijagnoza);

finalEditTexttmp10=(EditText)findViewById(R.id.txtTerapija);
tmp10.setText($Terapija);
finalEditTexttmp11=(EditText)findViewById(R.id.txtNapomena);
tmp11.setText($Napomena);
e.printStackTrace();
}
}
Ponovno, potrebna je standardna procedura za obradu pogreaka (throws IOException), jer se
moedogoditidaudatotenomsustavuizovogilionograzloganepostoji,ilijeoteenadatoteka
s podacima. Budui da smo prilikom spremanja podatke formatirali tako da se itava operacija
njihovogspremanjaizvodiujednomkoraku(tonijeobaveznoteovisiokarakteristikamavlastite
aplikacije), sada emo itanje takoer odraditi u jednom koraku, te ujedno razbiti podatke u
odgovarajuepoljepodatakapomounaredbe:
String[]list=TextUtils.split(string1,###);
Preostalo je jo samo to da se na koritenom rasporedu kontrola unutar aplikacije pronae
odgovarajuakontrolatedajojsedodijelitonoodreenavrijednostproitanaizdatoteke.Zataj
postupakkoristisenizfindViewByIdnaredbi.

10.Nekolikostandardnihdjelovaaplikacije

Proli put smo iz neto sloenije medicinski orijentirane Android aplikacije izvukli dio
programskog koda zaduen za spremanje podataka te za njihovo ponovno itanje kad se za tim
ukae potreba. U dananjem nastavku pokazat emo jo nekoliko karakteristinih dijelova
programskogkoda,kojeuzmanjeiliveepromjenemoeteupotrijebitiuvlastitimprojektima.
Prvojedansasvimlogian,alivaansavjet.SvakasloenijaAndroidaplikacija,anaroitoakoona
koristi razliite sistemske module (kao to je to sluaj u ovom primjeru), zahtijeva ukljuivanje
odgovarajuih biblioteka. Ovisno o nainu oblikovanja korisnikog suelja i pisanju programskog
koda,tajjepostupakunajveojmoguojmjeriautomatiziran.Meutim,akosetijekomrazvojau
aplikacijiodjednompojaviitavnizpogreaka,postojidostavelikavjerojatnostdanedostaje(zbog
izostanka ili sluajnog brisanja) odgovarajuaimportnaredba. U nastavku slijedi prikaz kako to
prilinokompliciranoizgledauovomsluaju:


Primjer rasporeda kontrola: Jedan od standardnih dijelova aplikacije za prikupljanje podataka o
korisniku.
importjava.io.BufferedReader;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.sql.Date;
importjava.text.DateFormat;
importjava.util.Calendar;
importandroid.R.bool;
importandroid.R.integer;
importandroid.R.string;

importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.PendingIntent;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.res.ColorStateList;
importandroid.location.Location;
importandroid.location.LocationManager;
importandroid.os.Bundle;
importandroid.os.Message;
importandroid.os.Messenger;
importandroid.telephony.SmsManager;
importandroid.text.TextUtils;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.ViewGroup.LayoutParams;
importandroid.widget.Button;
importandroid.widget.CheckBox;
importandroid.widget.CheckedTextView;
importandroid.widget.EditText;
U medicinski orijentiranoj aplikaciji ije dijelove koristimo za demonstraciju programskog koda,
zbogrelativnovelikekoliineprikupljenihpodatakaokorisnikuaplikacijeneprikladnezaprikazna
samo jednom zaslonu ograniene rezolucije (uobiajene kod mobilnih telefona opremljenih
Android sustavom), koristi se vie meusobno povezanih rasporeda kontrola, a na svakom od
rasporeda upotrijebljene su razliite kontrole kako bi se to jednostavnije i preglednije unijeli
relevantnipodaci.KakotozaistaizgledanazaslonuAndroidureajamoeteprovjeritinatemelju
priloenihslikauztekst,adijeloviodgovarajuegXMLkodanavedenisuunastavku.


<AbsoluteLayoutandroid:id=@+id/AbsoluteLayout01android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android>
<Buttonandroid:layout_width=wrap_contentandroid:layout_height=wrap_content
android:layout_x=0pxandroid:layout_y=0pxandroid:id=@+id/btn2VratiSe
android:onClick=btn2VratiSeClickandroid:text=&lt;&lt;Natrag></Button>
<Buttonandroid:layout_width=wrap_contentandroid:layout_height=wrap_content
android:layout_y=0pxandroid:text=Ponitinezgoduandroid:minWidth=150px
android:layout_x=90pxandroid:onClick=btn2PonistiNezgoduClick
android:id=@+id/btn2PonistiNezgodu></Button>

<TextViewandroid:layout_height=wrap_contentandroid:layout_width=wrap_content
android:text=Prezimeiime:android:id=@+id/txtvPrezimeImeandroid:layout_y=50px
android:layout_x=2px></TextView>
<EditTextandroid:saveEnabled=falseandroid:layout_height=wrap_content
android:layout_width=fill_parent
android:layout_x=0pxandroid:id=@+id/txtPrezimeImeandroid:singleLine=true
android:layout_y=65px></EditText>

<AbsoluteLayoutandroid:id=@+id/AbsoluteLayout01android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android>
<EditTextandroid:saveEnabled=falseandroid:layout_height=wrap_content
android:layout_width=wrap_contentandroid:singleLine=trueandroid:layout_y=65px
android:id=@+id/txtKrvnaGrupaandroid:maxLength=2android:text=__
android:layout_x=170pxandroid:maxWidth=50pxandroid:minWidth=50px>

<CheckBoxandroid:layout_height=wrap_contentandroid:layout_width=wrap_content
android:id=@+id/chkSidaandroid:layout_x=0pxandroid:text=Sida
android:layout_y=120px></CheckBox>
<CheckBoxandroid:layout_height=wrap_contentandroid:layout_width=wrap_content
android:layout_x=85pxandroid:layout_y=120pxandroid:text=HepatitisC
android:id=@+id/chkHepatitisC></CheckBox>

<CheckBoxandroid:layout_height=wrap_contentandroid:layout_width=wrap_content
android:id=@+id/chkDonatorandroid:text=Donatorandroid:layout_x=210px
android:layout_y=120px></CheckBox>
U trenutku prelaska s jednog rasporeda kontrola na drugi postojei sadraj kontrola iz starog
rasporeda kontrola sprema se za kasnije koritenje, a novi raspored kontrola se popunjava
prethodno spremljenim sadrajem (ako takav postoji zbog ranijeg koritenja aplikacije). Obje
operacije objanjene su u prethodnom nastavku serijala. Pokaimo sada kako se programskim
kodomprelazisjednograsporedakontrolanadrugi.Nasvakomosnovnomrasporedupostojedva
gumbazakretanjenaslijedeuodnosnoprethodnustranicu(razumljivoosimnaprvomizadnjem).
Slijediprimjerkoritenjanadrugomrasporedukontrolananjemupostojigumbzaprelazakna
prvi,odnosnonatreirasporedkontrola.
publicvoidbtn3VratiSeClick(Viewview)
{
try{
SpremiPodatkeCritical2();
}catch(IOExceptione1){
e1.printStackTrace();
}
setContentView(R.layout.critical);
try{
VratiPodatkeCritical();
}catch(IOExceptione){
e.printStackTrace();
}
}
publicvoidbtn3DaljeClick(Viewview)
{
try{
SpremiPodatkeCritical2();
}catch(IOExceptione1){

e1.printStackTrace();
}
setContentView(R.layout.critical3);
try{
VratiPodatkeCritical3();
}catch(IOExceptione){
e.printStackTrace();
}
}
Kako eventualne pogreke prilikom kretanja kroz osnovne rasporede kontrola ne bi izazvale
ruenje programa, prijenos prikaza s jednog rasproeda kontrola na drugi zamotan je u
odgovarajuustrukturuzaobradupogreke.
Osimprikazapodatakanastandardnimrasporedimakontrola,vrloestojeuprogramupotrebno
prikazati i odgovarajue dijaloke okvire o statusnim informacijama, grekama u radu i slino. U
nastavkujenavedenprimjerprogramskogkodazaprikazdijalokogokviraspodacimaoautorima
programa (ako za to ne namjeravate koristiti poseban raspored kontrola zbog vee vizualne
dojmljivostitakvogdijelaaplikacije).

Primjerrasporedakontrola:Drugistandardnidioaplikacije.
publicvoidbtnPrvaPomocClick(Viewview)
{
AlertDialogad=newAlertDialog.Builder(prvaPomoc.this).create();
CharSequenceporuka=Autorprograma\n;
poruka=poruka+CrnkoNenad\n\n;
poruka=poruka+Strunimedicinskisuradnik\n;
poruka=poruka+FusiSnjeana\n\n;
poruka=poruka+Verzijaprograma\n;
poruka=poruka+25.06.201023:00:00;
ad.setTitle(Oprogramu);
ad.setMessage(poruka);
ad.setButton(Zatvori,newDialogInterface.OnClickListener()
{
@Override
publicvoidonClick(DialogInterfacearg0,intarg1)
{
}
});
ad.show();
}
U sluaju da vam to negdje zatreba, evo i opefunkcije zaotvaranje osnovnog oblika dijalokog
okvirakojuuzveeilimanjepreinakemoeteupotrijebitiuvlastitimaplikacija.Ulazniparametri
funkcijesuporukakojaseprikazujeuokvirudijalokogokviratenjegovozaglavlje.
privatevoidMsgBox(StringPoruka,StringVrstaPoruke)
{

AlertDialogad=newAlertDialog.Builder(prvaPomoc.this).create();
ad.setTitle(VrstaPoruke);
ad.setMessage(Poruka);
ad.setButton(Zatvori,newDialogInterface.OnClickListener()
{
@Override
publicvoidonClick(DialogInterfacearg0,intarg1)
{
}
});
ad.show();
}
Navedimo na kraju dananjeg nastavka najsloeniji komad programskog koda zaduen za
pripremu i slanje SMS poruke s podacima iz programa u sluaju nezgode. Zbog ogranienja
prostora u asopisu ovim dijelom emo se neto detaljnije pozabaviti u slijedeem nastavku
serijala.
publicvoidbtnPosaljiSMSClick(Viewview)
{
finalButtonbtnPosaljiSMS=(Button)findViewById(R.id.btnPosaljiSMS);
CalendarKalendar=Calendar.getInstance();
CharSequencemTrenutnoVrijeme=Kalendar.getTime().toString();
mGodina=Kalendar.get(Calendar.YEAR);
mMjesec=Kalendar.get(Calendar.MONTH);
mDan=Kalendar.get(Calendar.DAY_OF_MONTH);
mSati=Kalendar.get(Calendar.HOUR_OF_DAY);
mMinute=Kalendar.get(Calendar.MINUTE);
mSekunde=Kalendar.get(Calendar.SECOND);

mTrenutnoVrijeme=Integer.toString(mDan)+.+
Integer.toString(mMjesec)+.+
Integer.toString(mGodina)++
Integer.toString(mSati)+:+
Integer.toString(mMinute)+:+
Integer.toString(mSekunde);
setContentView(R.layout.critical3);
try{
VratiPodatkeCritical3();
}catch(IOExceptione1){
e1.printStackTrace();
}
finalCheckBoxtp=(CheckBox)findViewById(R.id.chkGPSPozicija);
Stringpozicija=;
if(tp.isChecked())
{
try
{
LocationManagerlocationManager;
Stringcontext=Context.LOCATION_SERVICE;
locationManager=(LocationManager)getSystemService(context);
Stringprovider=LocationManager.GPS_PROVIDER;
Locationlocation=locationManager.getLastKnownLocation(provider);
doublelat=location.getLatitude();
doublelng=location.getLongitude();

pozicija=+Double.toString(lat)+/+Double.toString(lat);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
try
{
finalEditTexttmp=(EditText)findViewById(R.id.txtSMSPoruka);
Stringtmps=tmp.getText().toString();
if(tmps.length()==0)
{
setContentView(R.layout.main);
MsgBox(NijedefinirantekstSMSporuke!,Upozorenje);
return;
}
finalEditTexttmpbr=(EditText)findViewById(R.id.txtSMSBroj);
Stringtmpsbr=tmpbr.getText().toString();
if(tmpsbr.length()==0)
{
setContentView(R.layout.main);
MsgBox(NijedefiniranbrojzaslanjeSMSporuke!,Upozorenje);
return;
}

setContentView(R.layout.main);
VratiPodatkeMain();
tmps=tmps+pozicija;
SmsManagersm=SmsManager.getDefault();
sm.sendTextMessage(tmpsbr,null,tmps+pozicija,null,null);
}
catch(Exceptione)
{
MsgBox(e.getMessage(),Greka);
e.printStackTrace();
}
AlertDialogad=newAlertDialog.Builder(prvaPomoc.this).create();
CharSequenceporuka=ZabiljeenovrijemeslanjaSMSporukezapomo\n\n;
poruka=poruka+mTrenutnoVrijeme.toString();
ad.setTitle(Potvrdaoperacije);
ad.setMessage(poruka);
ad.setButton(Zatvori,newDialogInterface.OnClickListener()
{
@Override
publicvoidonClick(DialogInterfacearg0,intarg1)
{
}
});
ad.show();
btnPosaljiSMS.setText(SMSporuka:+mTrenutnoVrijeme);

try{
SpremiPodatkeMain();
}catch(IOExceptione){
e.printStackTrace();
}
}

11.Standardnidijeloviaplikacije

Nakrajutekstauprethodnombrojuasopisanavedenjemaloveisegmentprogramskogkodaza
izvoenjenekolikobitnihstvariuprogramu,alijednostavnonijebilodovoljnomjestazanjegovo
detaljnije objanjenje. Zato u dananjem nastavku slijedi malo detaljnija rasprava o koritenim
objektimaimetodamautomdijeluaplikacije.
Razjasnimoprvonamjenuizdvojenogdijelaprogramskogkodaskrajaprethodnognastavka,kako
bi lake mogli pratiti detalje u nastavku. Ideja je da korisnik aplikacije u trenutku kad doivi
nekakvunezgodu(kojabitnoutjeenanjegovozdravstvenostanje)moetojednostavnijeibre
poslatiSMSporukunaunaprijeddefiniranibroj,kakobiizabranuosobuiliustanovuobavijestioo
svojoj nezgodi. Pretpostavka za izvoenje takvog postupka je da nakon nezgode ostane u
svjesnom stanju, kako bi zaista mogao pokrenuti aplikaciju te pritisnuti gumb za slanje SMS
poruke. Ako moe napraviti tu operaciju, onda moe pritisnuti i drugi gumb kako bi zabiljeio
vrijeme nezgode, jer se tako kod pruanja prve pomoi lako moe ustanoviti koliko je vremena
doista prolo od nezgode. To moe biti vrlo bitan faktor za poduzimanje razliitih operacija nad
unesreenim. ak i ako korisnik aplikacije u trenutku kad stigne prva pomo bude u nesvijesti,
moeseproitatipodatakotrenutkunezgode,kaoidrugimbitnimkarakteristikamaunesreenog
(krvnagrupa,kroninebolestiislino).TeinformacijesudostupneiusituacijikadSMSporukanije
poslana,anijezabiljeennitrenutaknezgodebitnojesamodaspasiteljimaloproeprkajupo
Androidmobitelu,jerjeonnajverojatnijenegdjepriruci.Ostajejosamoodgovornapitanjezato
suoperacijeslanjaSMSporukeibiljeenjatrenutkanezgoderazdvojene.PostojesituacijekadSMS
poruku, a pogotovo neke njezine dijelove (vidi nastavak teksta) nije mogue ni pripremiti ni
poslati,paseutomsluajumoezabiljeitisamotrenutaknezgode.


LocationManager:VrlosloenobjektnaAndroidplatformizaduenzadobijanjetonegeografske
lokacije.
Prvi dio programskog koda je najjednostavniji za objanjavanje jer slui za obino odreivanje
tonog vremena nakon pritiska korisnika na odgovarajui gumb aplikacije. To vrijeme se trajno
pamtikakobigaspasiteljimoglinaknadnooitati.Ovajsegmentprogramskogkodazamotanjeu
standardnurutinuzaobradupogreke,usluajudasedogodinekakavproblemtijekomizvoenja
aplikacije.
publicvoidbtnPosaljiSMSClick(Viewview)
{
finalButtonbtnPosaljiSMS=(Button)findViewById(R.id.btnPosaljiSMS);
CalendarKalendar=Calendar.getInstance();
CharSequencemTrenutnoVrijeme=Kalendar.getTime().toString();
mGodina=Kalendar.get(Calendar.YEAR);
mMjesec=Kalendar.get(Calendar.MONTH);
mDan=Kalendar.get(Calendar.DAY_OF_MONTH);
mSati=Kalendar.get(Calendar.HOUR_OF_DAY);
mMinute=Kalendar.get(Calendar.MINUTE);

mSekunde=Kalendar.get(Calendar.SECOND);
mTrenutnoVrijeme=Integer.toString(mDan)+.+
Integer.toString(mMjesec)+.+
Integer.toString(mGodina)++
Integer.toString(mSati)+:+
Integer.toString(mMinute)+:+
Integer.toString(mSekunde);
setContentView(R.layout.critical3);
try{
VratiPodatkeCritical3();
}catch(IOExceptione1){
e1.printStackTrace();
}
finalCheckBoxtp=(CheckBox)findViewById(R.id.chkGPSPozicija);
DabiSMSporukakojasealjenaunaprijeddefiniranitelefonskibrojbilatokorisnija,idejajeda
njezin dio bude tona geografska lokacija s koje je poruka poslana, kako bi se to bre i
jednostavnijedolodounesreenogkorisnikaaplikacije.Akomobilnitelefon(ilinekidrugiureaj
kojisetemeljinaAndroidplatformi)usebisadriodgovarajuihardverskidiozadobijanjetakvog
podatka, onda slijedei dio programskog koda koristi Android objektLocationManagerza
dobijanjepotrebnoggeolokacijskogpodatka.
Stringpozicija=;
if(tp.isChecked())
{
try
{
LocationManagerlocationManager;
Stringcontext=Context.LOCATION_SERVICE;
locationManager=(LocationManager)getSystemService(context);

Stringprovider=LocationManager.GPS_PROVIDER;
Locationlocation=locationManager.getLastKnownLocation(provider);
doublelat=location.getLatitude();
doublelng=location.getLongitude();
pozicija=+Double.toString(lat)+/+Double.toString(lat);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
Prethodne naredbe sadre jo nekoliko naredbi za formatiranje podataka o geografskoj lokaciji,
kako bi podaci u okviru poruke bili prikazani na to itljiviji podaci razumljiv spasiteljima. Kao i
obino, bitno je da takv dio aplikacije podloan pogrekama bude obuhvaen u strukturu za
obradupogreaka.Zahtijevanipodatakmoeunekomtrenutkujednostavnobitinedostupan.Na
primjer, izvor GPS podataka je uniten solarnom bakljom. Dobro malo se alimo, mnogo je
vjerojatniji neki drugi uzrok problema, iako prema najavama nekih strunjaka 2012 godine to
modauopevieneebitisamoala.
LocationManagerjevrlosloenobjektnaAndroidplatformipanjegovodetaljnoopisivanjeprelazi
okvire ovog teksta. Osnovni primjer prikazan u prethodnom dijelu programskog koda, trebao bi
vamposluitikaovodizadodatnoistraivanjeprateihuputaoAndroidSDKsustavu.
Nakon to su pripremljeni svi potrebni podaci o geografskoj lokaciji, preostaje jo samo njihovo
spajanje s unaprijed definiranim fiksnim dijelom SMS poruke, te slanje poruke na prije upisani
mobilni broj. U sluaju da navedena dva podatka nisu pripremljena, onda se korisniku aplikacije
javljaodgovarajuaporukakakobiserijeioproblem.Zatosekoristifunkcijaoijojsmonamjenii
djelovanjuraspravljaliujednomodprethodnihnastavakaserijala.
Sasvim je jasno da kritina situacija, u kojoj se moe nai korisnik aplikacije, nije ba idealan
trenutakdaaplikacijajavikakosmoufazinjezinogpunjenjapoetnimpodacimazaboravilinavesti
nekidetalj(fiksnidioSMSporukeiliodredinibroj).Otprilikeseradioistojsituacijikaokadbiva
najnoviji automobil (dostupan uz mjesenu ratu od svega 500 kn, ali uz uee od 30 posto i
ostatakvrijednostiod30postokakotodanasnudesitnimslovimanekioglasinakojeseskoro
navukaoiautorovihredova),utrenutkuhitnogkoenjajavionekakvuporukudatonemoeiline
elinapraviti.Rjeenjeproblemajevrlojednostavno.Nakonupisivanjasvihpotrebnihpodatakau
aplikaciju na samom poetku njezina koritenja, treba poslati probnu poruku te provjeriti je li
zaistasveuredu.

try
{
finalEditTexttmp=(EditText)findViewById(R.id.txtSMSPoruka);
Stringtmps=tmp.getText().toString();
if(tmps.length()==0)
{
setContentView(R.layout.main);
MsgBox(NijedefinirantekstSMSporuke!,Upozorenje);
return;
}
finalEditTexttmpbr=(EditText)findViewById(R.id.txtSMSBroj);
Stringtmpsbr=tmpbr.getText().toString();
if(tmpsbr.length()==0)
{
setContentView(R.layout.main);
MsgBox(NijedefiniranbrojzaslanjeSMSporuke!,Upozorenje);
return;
}
setContentView(R.layout.main);
VratiPodatkeMain();
tmps=tmps+pozicija;
SmsManagersm=SmsManager.getDefault();
sm.sendTextMessage(tmpsbr,null,tmps+pozicija,null,null);
}
catch(Exceptione)

{
MsgBox(e.getMessage(),Greka);
e.printStackTrace();
}
AlertDialogad=newAlertDialog.Builder(prvaPomoc.this).create();
CharSequenceporuka=ZabiljeenovrijemeslanjaSMSporukezapomo\n\n;
poruka=poruka+mTrenutnoVrijeme.toString();
ad.setTitle(Potvrdaoperacije);
ad.setMessage(poruka);
ad.setButton(Zatvori,newDialogInterface.OnClickListener()
{
@Override
publicvoidonClick(DialogInterfacearg0,intarg1)
{
}
});
ad.show();
Na kraju cijelog postupka prikazuje se tono vrijeme slanja poruke. Ne treba posebno ni
napominjati da se svi podaci iz prethodne operacije spremaju u odgovarajua spremita u
mobilnomtelefonu,kakobiikasnijebilidostupnipremapotrebi.
btnPosaljiSMS.setText(SMSporuka:+mTrenutnoVrijeme);
try{
SpremiPodatkeMain();
}catch(IOExceptione){
e.printStackTrace();
}

}
Natemeljusvegadosadnapisanoguovomteuprethodnihnekolikobrojeva,vebitrebalibitiu
mogunostisamiizraivatirelativnosloeneAndroidaplikacije.Meutim,jouvijeknismozavrili
serijal, jer nam je preostala demonstracija koritenja nekoliko bitnih tehnika kao to je dobro
poznatiGoogleMaps,preuzimanjepodatakasugraenihsenzora,koritenjedodatnihgrafikihi
zvunihmogunostitejoponekazanimljivihsitnica.Ostalojejodostazanimljivogmaterijalaza
slijedeih nekoliko nastavaka, posebno ako sve te dijelove uz dodatak ve obraenih elimo
kreativnopovezatiupraveaplikacije.

LocationManager:VrlosloenobjektnaAndroidplatformizaduenzadobijanjetonegeografske
lokacije.
Buduidasmouzadnjihnekolikobrojevavadilidijeloveprogramskogkodaizrelativnosloene
aplikacije,nismonaprateemdigitalnommedijuobjavljivalidijeloveprojekta.Odslijedeegputa
ponovo se vraamo na staru dobru praksu koritenja prateeg medija uz asopi, kako se ne bi
trebali sami muiti s prekucavanjem manjih ili veih dijelova programskog koda u korisniko
sueljevlastitograunala.

12.Alternativnipristuprazvojuaplikacija
U prethodnih desetak (i jo malo vie) nastavaka serijala o Android programiranju pokazali smo
dosta toga to vam moe pomoi kod razvoja vlastitih aplikacija poevi od instalacije svih
potrebnihalatanavlastitoraunalopasvedorazvojastandardnihdijelovasloenijihaplikacija.U
meuvremenuseureajibaziraninaAndroidu(telefoni,aliitabletiitedrugimobilniureaji)
sve bolje prodaju irom svijeta, tako da razvoj aplikacija za ovu platformu sigurno nee biti
uzaludannapor.
Iako emo se u slijedeih nekoliko nastavaka serijala pozabaviti s jo nekoliko naprednijih
programerskih tehnika, ovaj put emo se malo detaljnije osvrnuti na alernativni (itaj bitno
jednostavniji)nainzarazvojaplikacija,takoernastaouradionicamaistogproizvoaa.Nakraju
krajeva meu itateljima asopisa sigurno ima onih s vrlo dobrim idejama za razvoj novih
aplikacija, ali im se koritenje Google SDK alata ipak ini malo prekompliciranim. Sreom,
Googleovi inenjeri intenzivno rade na neto drugaijem pristupu itavoj stvari, pa emo vas u
dananjemnastavkuupoznatisnjihovimnajnovimuradkomzatunamjenu.
App Inventor for Androidje naziv za alat namijenjen malo manje spretnim programerima
dizajniranimtakodaomoguavavizualnoorijentiranirazvojrazliitihAndroidaplikacijaizravnou
pregledniku. Zbog toga je pisanje programskog koda gotovo u potpunosti izbaeno iz alata te
zamijenjenoneimgenijalnopreglednim.Akosteipakzainteresiranizaprogramiranje,ondavam
ovajalatzapravoinetreba,jerveimatedobropoznatiAndroidSDK.
Iakoutrenutkupisanjateksta(prematvrdnjamaizsamogGooglea)alatjouvijeknepodravasve
tojezamiljeno(jouvijeksenalaziubetafazirazvoja)vesadasepomounjegamogunapraviti
zanimljive i korisne aplikacije. Googleovi inenjeri naglaavaju kako se trenutni problemi prije
svegaodnosenapodrujainstalacijeupravljakihureaja,prijenosadijelovarazvojnogalataJava
na raunalo te distribuciju same aplikacije na odredini mobilni ureaj, odnosno postavljanje
razliitih postavki koritenja aplikacije na tom ureaju. Zato se u trenutnoj fazi razvoja alata od
zainteresiranih korisnika trai da pripreme to detaljnije povratne informacije o koritenju alata,
kakobisetoprijeprevladalisviuoeniproblemi.

Priprema raunala za razvoj: Mogu se koristiti razliite kombinacije operativnih sustava i


preglednika.
RazvojvlastitihaplikacijaualatuAppInventorforAndroidzapoinjepripremomvlastitograunala
za takav zadatak. Za razliku od Microsofta ili Applea poznatih po ograniavaju razvoja na vlastiti
hardver i/ili softver, Googleov razvojni tim kontinuirano podrava sve najpopularnije platforme
(Windows,MaciLinux).ZatonijeniudodaseAndroidpolako,alisigurno,probijapremasamom
vrhu popularnosti na podruju mobilnih platformi. Nastavak teksta, te prije svega pratee slike)
podrazumijevajurazvojvlastitihaplikacijauGoogleChromepreglednikunaWindowsraunalu,ali
iz prije navedenih razloga ne bi trebali imati previe problema ni u razvoju aplikacija na nekoj
drugojkonfiguraciji.
Prvikorakupripremiraunalajepreuzimanjeodgovarajuegprogramazaupravljanjepripremom
razvojne konfiguracije. Ovaj program moe se slobodno preuzeti usmjeravanjem preglednika na
webadresuhttp://appinventor.googlelabs.com/learn/setup/setupwindows.html
Nakonpreuzimanjainstalacijskogprogramatrebagainstaliratinaraunalotepodesitiparametre
ciljnogmobilnogureaja.Utrenutnojfazirazvojaalatapodranojeizravnosveganekolikoureaja
poputTMobileG1iliTMobilemyTouch,doksezaostalo ovrsjetrebapomuitimaloviete
napraviti manja ili vea podeavanja na samom telefonu. Budui da je ovaj postupak ovisan o
samom telefonu, kao takav prelazi okvire napisanog teksta. Sve potrebne informacije moete
pronaislijedeiodgovarajuelinkovenaprijenavedenojwebadresi.

Poetakradanaaplikaciji:ZapoinjestvaranjemprojektauovomsluajuHelloPurr.

Izradaprveaplikacije
UnastavkutekstaopisatemoizraduprveaplikacijepremaGooglevojprateojdokumentaciji.Za
razlikuoduobiajenogHelloWorldprimjerakojisamoprikazujedvijerijeinazaslonu,Googleov
poetni primjer odmah koristi i audio/video podatke, to jest prikazuje sliku te reproducira zvuk.
Zatokaopoetnikorakuizradiaplikacijetrebaskinutijednuslikuu.pngformatu,odnosnojednu
zvunu datoteku u.mp3formatu. Umjesto onih koje nudi Google za testiranje razvojnog alata,
moeteupotrijebitisvojevlastite,alizasadaemosedratipriloenekuharice.
Razvojni alat pokreete postavljanjem preglednika na adresuhttp://appinventor.googlelabs.com.
Dabisemogloprijeinarazvojsameaplikacijepotrebnojedakorisnikimaodgovarajuigoogle
emailkorisnikiraun.Akogajonemate,ovojeprilikadagastvorite.Kadobavitetuformalnost,
pojavljuje se stranica namijenjena pripremi novih aplikacija, odnosno administriranju postojeih.
Budui da pripremate svoj prvi projekt, izaberite opcijuNewna vrhu stranice te upiite naziv
aplikacijeHelloPur.

Razvojnaokolina:Vrlojejednostavnainamijenjenakorisnicimakojinisuprofesionalniprogrameri.
Kao rezultat izvoenja prethodne operacije pojavljuje se glavna stranica razvojnog alata
namijenjenaizradiaplikacije(vidiprateeslikeuztekst).Sveizgledavrlojednostavno,alijesasvim
dovoljnozakorisnikekojimajenamijenjenaneprofesionalnimprogramerimasdobrimidejama
zavlastiteaplikacije.
U lijevom dijelu stranice nalaze se razliite grupe kontrola namijenjene iskoritavanju brojnih
mogunosti Android sustava. Tijekom razvoja prve aplikacije bit e nam potrebne svega dvije
kontrole:ButtoniLabel.Jednostavnomoperacijompovlaenjapostaviteinnasredinjidiostranice
namijenjensimuliranjuzaslonamobilnogureaja.Kontrolepostavitejednuispoddruge,aondaje
preostalo da im izmijenite nekoliko svojstva, kako bi dobili izgled suelja prikazan na jednoj od

prateih slika uz tekst. KontroliButtonpotrebno je obrisati poetni tekst prikazan na kontroli


(svojstvoText)teuitatiprijespomenutuslikukitty.png(svojstvoImage).KontroliLabelpotrebno
je postaviti boju pozadine na plavu (svojstvoBackgroundColor), poveati veliinu pisma na 30
(svojstvoFontSize),teupisatinovitekstPettheKitty.Svojstvokojesekoristizazadnjuoperaciju
veznatesprvekontrole.SvetoseizvodiuprozoruPropertiesnadesnojstraniosnovnestranice.

Postavljanje prve kontrole: Izvodi se obinim povlaenjem kontrole na centralni dio koji
predstavljazaslonmobilnogureaja.
Na ovom stupnju razvoja aplikacije u nju je dodana slika, ali jo uvijek ne i zvuni zapis. Zato je
potrebnouaplikacijupovuijojednukontrolu(SoundizgrupeMedia),aondapomougumbana
dnu stranice dodati prije spomenutump3datoteku (meow.mp3). Ovim potezom suelje je u
potpunostidovrenosdizajnerskestrane,alijezakompletiranjeaplikacijepotrebnonapravitijo
neto. Da bi se tijekom izvoenja aplikacije pritiskom na sliku umiljate makice izazvalo njezino
glasanje,tojestreprodukcijamprdatoteke,potrebnojeipaknapisatimaliprogram.Prethodnu
tvrdnjusmostaviliuznakenavoda,jerjezarazlikuoddrugihvizualnoorijentiranihsuelja,kojau
konanici ipak zahtijevaju prilino znanje programiranja, Google ovdje stvarno napravio korak
naprijed.
Na vrhu osnovne stranice potrebno je kliknuti na opcijuOpen the Block Eidtor, a ako ste to
napravili prvi put, priekati odreeno vrijema kako bi se na vae raunalo instalirala dodatna
komponenta za pisanje programskog koda. Evo ponovno navodnika, a konano i
objanjenja zato. Kad se otvori popis svih dostupnih dogaaja, oni su prikazati u obliku
svojevrsneslagalice.Potrebnidogaajukontekstunekogdijelaaplikacijepotrebnojejednostavno
spariti s pravom operacijom, to se izvodi obinom operacijom povlaenja. U konkretnom
sluajupotrebnojedogaajButton1.ClickpovezatisoperacijomSound1.Playitojeto.Kolikoto
efektnoizgledamoeteprovjeritinapriloenojsliciiliisprobatisami.BravoGoogle!


ProzorProperties:Koristisezaizmjenurazliitihsvojstavaoznaenekontrole.
Preostalojejosamodaisprobateaplikacijunastvarnomhardverskomureajutijekominstalacije
povezanimsrazvojnimalatom,ilinaodgovarajuemsoftverskomemulatoru.Nakrajujepomou
operacijePackageforPhonemoguenapravitiidistribucijskioblikaplikacije.
Priznajtedanijebilokomplicirano,iakonismobadetaljnoopisivalinainpromjenesvojstava.Ipak
bi ovaj tekst trebali pratiti itatelji s bar poetnim poznavanjem programiranja, tako da ne bi
trebaobitiproblemizvestitakoelementarneoperacijeudizajnuaplikacije.
Pomou alata App Inventor for Android (iako je jo uvijek u fazi beta verzije) mogu se napraviti
znatnosloenijeaplikacijeutosemoeteuvjeritiisaminakonmalovjebe.


Dodavanjeprogramskogkoda:Zaistaseizvodinavizualnoefektannain.

Izvoenjeprograma:Osimnasamomureaju,moguejeiuodgovarajuememulatoru.

13.AlternativnipristuprazvojuaplikacijaII

ProliputsmodemonstriraliosnovekoritenjaGoogleovogalternativnogalatazarazvojAndroid
aplikacija namijenjenog neprogramerima i malo manje spretnim programerima.App Inventor
forAndroid,kakojenjegovnaziv,pokazaosesasvimprikladnimzastvaranjeelementarneAndroid
aplikacije (neto slino klasinom Hello World primjeru), a danas emo probati prikazati da je
upotrebljivzabitnosloenijeprojekte.
Odgovorimo prvo na nekoliko najvanijih pitanja povezanih s koritenjem alata na razvoju
sloenijih projekata. Najvanije pitanje koje se namee samo po sebi je potencijalna sloenost
dovrene aplikacije. Tu odmah treba biti izravan te rei da se pomou alata App Inventor for
Androidnemoenapravitibasvetoisslubenimrazvojnimalatom,alidasemoepunotoga
moese.Osimbrojnihkomponentizarazvojrazliitihdijelovasuelja(tosmodjelomicepokazali
u u prolom uvodnom tekstu o alatu), na raspolaganju su najvanije programske strukture
poputforeach,while,ifelse(iakounetoslikovitijemoblikunegojetouobiajenouprogramskim
jezicima), a mogua je i komunikacija s web servisima te svojevrsnim spremitem podataka. Od
vanijih tehnologija karakteristinih za mobilne ureaje dananjice, trenutno nije podran samo
Bluetooth,aliseprematvrdnjamaproizvoaaintenzivnoradiinatomsegmentu.

Basickomponente:Predstavljajuosnovnegrafikeelementeaplikacije.
Ako vam sluajno ni sve nabrojano nije dovoljno za izradu vlastite aplikacije, onda alat skoro
neogranienomoetenadopunjavatiizradomvlastitihkomponentiuJavi.Toznaidamorateipak
biti neto vjetiji u programiranju, a onda se neminovno postavlja pitanje zato ne bi sve skupa
ipak programirali u standardnom SDK razvojnom sustavu. Ako pomou alata App Inventor for

Androidmoetesamiodraditiveidioprojekta,ondaimasmisladazamanjinedostajuisegment
vlastiteaplikacijeangairateJavaprogrameradavampomogne.
Trenutno dva najvea nedostatka alata odnose se na nemogunost izravne objave aplikacije na
globalnom tritu Android aplikacija (Android Market), te ogranienost aplikacije na samo jedan
prikaz (raspored kontrola). Google obeava kako e prvi problem biti uskoro rijeen pa se zato
njime neemo previe baviti. Napiimo zato nekoliko rijei o drugom problemu. Na trenutnom
stupnja razvoja alata ne moe se izvoditi prebacivanje izmeu vie razliitih vrsta prikaza ili
rasporedakontrola.Tonaprvi,drugiitreipogledpredstavljazbiljavelikoogranienjeurazvoju
aplikacija,aligajeipakmogueprevaziijednimodslijedeadvatrika.
1. Naizmjeninim paljenjem i gaenjem kontrola, to jest izmjenom vidljivosti razliitih
komponentipostavljenihnajedinidostupniprikazkontrola.
2. Meusobnim viestrukim povezivanjem vie App Inventor for Android aplikacija,od kojih
svaka moe imati razliite rasporede kontrola na osnovnom zaslonu. Kad su prije koje
desetljeenetoslinomogliraditiautorisloenihigaranastrojevimapoputZXSpectruma
ili Commodorea 64 te kasetofonom kao ureajem vanjske memorije, nema nikakvog
razlogazatosetonebimoglonapravitiidanassaznatnomodernijimhardverom.

Media komponente: Komponente za upravljanje razliitim multimedijalnim dijelovima mobilnog


ureaja.
Iakoslijedeavijestnemanikakvevezesprethodnomtokom,dananjimtekstom,paaknicijelim
serijalom u cjelini, ipak u je spomenuti na ovom mjestu, ako je do sada ve niste sami negdje
proitali.KultniCommodore64jeprijekratkogvremenadoiviosvojuinkarnacijusistimizgledom
izvana,aliultramodernimhardveromisoftveromiznutra.Narudbesemogunapravitivesada,a
isporuka se oekuje u petom mjesecu. Morao sam to jednostavno spomenuti prve ljubavi se
tekozaboravljaju,makartobilairaunala.

Vratimosesadaponovodananjojtemi.Kljunedijeloveaplikacijemoemopodijelitiudvijevelike
skupine:
1. Komponenteilikontrole
2. Blokove
Komponentesuosnovnigrafikidijeloviaplikacije,ameusobnoseosimpoizgledurazlikujuprije
svegaposvojojnamjeni.OsnovnagrupakomponentipodnazivomBasicobuhvaazbiljaosnovne
komponente karakteristine za moderna korisnika suelja poput gumbi, oznaka i slika. Ako ste
ikadprobalinapisatibilokakvuaplikacijuunekommodernijemrazvojnomalatu,trebalibiznatio
emu je rije, pa se zato i neemo previe baviti njihovim karakteristika. U istoj grupi kontrola
nalaze se jo dvije sloenije kontrole, a one ipak zahtijevaju poneku dodatnu rije. To
suCanvasiTinyDB.

Animationkomponente:PreduvjetzanjihovokoritenjejepostojanjekomponenteCanvas.
Kontrola Canvas zamiljena je kao dvodimenzionalno podruje za crtanje likova pomou
programskogkoda,odnosnozapomicanjesliica(sprites).Buduidajetoistopodrujeosjetljivo
nadodir,sasvimjerazumljivodapredstavljatemeljnidioveinerazliitihigararazvijenihuovom
alatu.SvakaodlokacijanakomponentiCanvasoznaavaseuobiajenimmatematikimzapisomza
dvodimenzionalne povrine kao koordinate x i y. O vanosti navedene kontrole u razvoju
aplikacija najbolje govori injenica da je u zadnjoj reviziji alata od strane Googlea s kraja treeg
mjeseca,velikidiopoboljanjadodanupravouCanvaskontrolu.
NekaodtipinihsvojstavaimetodaCanvaskontrole,ijaimenagovoresamazasebesu:
BackgroundImage, LineWidth, Touched(number x, number y, boolean touchedSprite), Clear(),
DrawLine(number x1, number y1, number x2, number y2), DrawCircle(number x, number y,
numberr).

Tijekom pisanja igara kontrola Canvas se vrlo esto upotrebljava u kombinaciji s


kontrolomClockkako bi se osiguralo odvijanje operacija u zadanim vremenskim intervalima.
SpomenimonaovommjestukakokontrolaClockujednopripadagrupinevidljivihkontrola,to
znaidaseneviditijekomizvoenjaaplikacije,alimorabitinacrtananaosnovnojformikakobise
moglekoristitinjezinemogunosti.
Kontrola TinyDB namijenjena je trajnom spremanju podataka iz aplikacije u mobilni ureaj.
Prilikomsvakogprekidaizvravanjaaplikacijegubisesadrajsvihkoritenihkontrolateseponovo
puniinicijalnimvrijednostimakodslijedeegpokretanjaaplikacije.Akoprilikomnovogpokretanja
aplikacije treba krenuti od njezinog zadnjeg stanja, onda treba postojati nekakav mehanizam za
spremanje vrijednosti iz aplikacije u Android ureaj, te njihovo ponovno itanje (na primjer,
postavkeaplikacije,stanjebodovauprivremenoprekinutojigriislino).Upravozatakvunamjenu
zamiljenajekontrolaTinyDB,odnosnonjezinedvijejedinedostupnemetode:

StoreValue(oznaka,vrijednost)
Sprema vrijednost (niz znakova ili popis) pod odreenim nazivom u spremite na mobilnom
ureaju.

GetValue(oznaka)
ita vrijednost sa zadanim nazivom iz spremita. U sluaju da traena oznaka ne postoji u
spremitu (npr. kod prvog pokuaja itanja vrijednosti na novom ureaju), onda metoda vraa
prazannizznakova.
U sluaju da treba obrisati spremite od starih vrijednosti, onda se to izvodi na telefonu
standardnomnaredbomSettingsApplicationsManageApplications.
U grupi kontrola pod nazivomMedianalazi se 5 komponenti slijedeih naziva:Camera,
ImagePicker, Player, SoundiVideoPlayer. Svaka od kontrola zaduena je za upravljanje
odgovarajuim hardverskim ili softverskim resursom, pa su u skladu s tim i dodijeljeni nazivi
svojstava odnosno metoda (npr.TakePictureiliAfterPictureza kontrolu Camera, odnosnoStart,
StopiliPausezakontroluPlayer).
Grupa kontrolaAnimationte njezine dvije jedine komponenteBallodnosnoImageSprite, koriste
seukombinacijisprijespomenutomkontrolomCanvaszaaplikacijeukojimajepotrebnoizvoditi
razliitevrstepokretanjagrafikihobjekata(daklenajeeigre).Napriloenojsliciuztekstvidise
da je preduvjet za koritenje kontroli iz ove grupe upravo postojanje kontrole Canvas. Pomou
svojstava kontrola poputInterval,SpeediliRotatesupravlja se uestalou, brzinom i rotacijom
sliicaililopticauvlastitojaplikaciji.BuduidaujednojaplikacijimoebitivieCanvaskontrola,
nema nikakvog razloga da njihovim inteligentnim paljenjem i gaenjem na jednom jedinom
zaslonu (prije istaknuto ogranienje trenutne verzije razvojnog alata) napravite prilino
kompleksnuigru.


Social komponente: Zaduene su za pristup i koritenje razliitih socijalnih podataka iz mobilnog
ureaja.
Posljednja grupa kontrola koju emo spomenuti u dananjem nastavku su kontrole iz
grupeSocialzaduene za pristup i koritenje razliitih socijalnih podataka iz mobilnog ureaja
(ContactPicker, EmailPicker, PhoneCall, PhoneNumberPicker, TextingiTwitter). Pomou ovih
kontrolamoguejepostiidavlastiteaplikacijeupravljajutelefonskimpozivima,slanjemsmsi/ili
email porukama, odnosno koritenjem usluga Twittera (npr. koritenjem metoda
poputDirectMessage,RequestDirectMessageiliRequestFriendTimeLine).
U slijedeem nastavku napravit emo pregled preostalih dostupnih kontrola, a onda napraviti
nekoliko sloenijih primjera, koji bi trebali prikazati kako ovim alatom doista nije problem brzo
napravitiiznatnosloenijeaplikacije.

14.AlternativnipristuprazvojuaplikacijaII

Danas emo se pozabaviti preostalim komponentama dostupnim u Googleovom alatu App


InventorforAndroidnamijenjenombrzomrazvojuAndroidaplikacija.Komponentesurazvrstaneu
nekoliko grupa slijedeih naziva:Sensors,Screen Arrangement,LEGO MINDSTORMS,Other
stuffiNotreadyforprimetime.Krenimoredom.


Sensorskomponente:Zaduenesuzaupravljanjerazliitimsenzorimaumobilnomureaju.

Sensorskomponente
Danas je sasvim uobiajeno da pametni telefoni i drugi ureaji temeljeni na Androidu imaju
ugraen manji ili vei broj senzora, koji se mogu vrlo djelotvorno iskoristiti u razliitim vrstama
aplikacija (najee igrama). Zbog toga je razvijeno nekoliko posebnih komponenti za relativno
jednostavnu podrku takvoj vrsti hardvera. Sve komponente su nevidljive tijekom izvoenja, ali
morajubitiukljueneuaplikacijudabisemogleiskoristitinjihovemogunosti.
KomponentaAccelerometerSensorzaduena je za interakciju softvera sa senzorom za mjerenje
pomicanjaureajaposvetriosikoordinatnogsustava.Odtudadolazenazivinajvanijihsvojstava:
XAccel, YAccel, Zaccel. Pomou svojstva Available programer moe provjeriti jesu li navedeni
senzor uope dostupni u ureaju, a svojstvom Enabled upravljati dozvolom koritenja senzora.
DogaajemAccelerationChangedmoesepreciznoreagiratinapomicanjeureajapobilokojojod
navedenetriosi(parametaradogaaja),dokjenetogrubljidogaajShakingnamijenjenmnogo
jednostavnijemzadatkuobinojprovjeridrmanjaureajem.Drugidogaajsenajeemoe
upotrijebitizaefektanprekidizvoenjarazliitihoperacijauaktivnojaplikaciji.
DruganevidljivakontrolaizisteskupinejeLocationSensor,anamijenjenajedobijanjugeografske
pozicije mobilnog ureaja, ako je u njega ugraen odgovarajui GPS prijemnik (svojstvo
HasLongitudeLatitude). Softverski je podrano mjerenje nadmorske visine (svojstvo HasAltitude),
akoitakvamogunostpostojiuhardveru.Ostalimdostupnimsvojstvimamoesedobitivrijednost
svakeodnavedenihtridimenzija,doksudogaajiLocationChangedteStatusChangedzadueniza
reakcijuaplikacijenapromjenepozicijeureajauprostoru,odnosnonapromjenenainamjerenja
pozicije(izravnodobijeniGPSpodaciilipodacidobijeniodmrenogoperatora).

Zadnja komponenta iz grupeOrientationSensorzaduena je za provjeru orijentacije ureaja u


prostoru(svojstvaRoll,PitchiYawtedogaajOrientationChanged).Ovasofverskakomponentase
ukombinacijispripadajuimsenzoromkoristiurazliitimaplikacijamazapromjenunainaprikaza
podatakaovisnoopromjeniorijentacijeureaja(vodoravniilivertikalniprikazpodataka).

ScreenArrangementkomponente

ScreenArrangementkomponente:Koristesekaopodlogazarasporeddrugihkontrola.
Sve tri komponente iz ove grupe (HorizontalArrangement, TableArrangement i
HorizontalArrangement) zaduene su za jednostavnije rasporeivanje ostalih komponenti po
zaslonu ureaja. Kao to im i nazivi govore, svaka od komponenti je zaduena za jednu vrstu
rasporedaosnovnihkontrola.Osimzapoetnorasporeivanjekontrolasvetrikomponentemogu
se takoer iskoristiti za njihovo jednostavnije premjetanje ili skrivanje. Dostupna svojstva
kontrolasuvrlojednostavnaterazumljivasamaposebi(Visible,Height,Width,RowsiColumns).

LEGOMINDSTORMSkomponente
SedamkomponentiizgrupeLEGOMINDSTORMSpredvienesuzaupravljanjerazliitihdijelovima
poznatog Lego kompleta za uenje robotike pomou nekog od Android ureaja. Iskreno, nismo
imaliprilikunizadovoljstvoisprobatikakosvetoskupadjelujeupraksi,pasezatozasadaneemo
previenibavitiovimdijelomrazvojnogalata.Nadamosedaemounetakodalekojbudunosti
ipakbitiupriliciisprobatisimbozuLegoiGoogleproizvoda.

Otherstuffkomponente


LEGOMINDSTORMSkomponente:ZaduenesuzapovezivanjesLegoovrsjem.
arolikodrutvosoftverskihkomponentiizovegrupenikakoseposvojojnamjeninemoedovesti
uizravnuvezu,zbogegajecijelagrupadobilanazivkojioznaavatakvuraznolikost.
Jedna od najvanijih komponenti iz grupe je komponentaActivityStater. Zaduena je za
pokretanje nekoliko razliitih aktivnosti na ureaju: drugih aplikacija napravljenih u istom alatu
akotakvepostojeuureaju(imesemoeizbjeidostaozbiljnoogranienjeokoritenjujednog
zaslonaekranapoaplikaciji),aplikacijezaduenezaupravljanjekamerom(akojekameraugraena
u mobilni ureaj), pretraivanje web sadraja, postavljanje preglednika na tono odreenu web
adresu,odnosnopostavljenjetonoodreenelokacijenakarti.Zbogtogakomponentapodrava
razliite naine vlastitog pozivanja. Evo primjera iz pratee dokumentacije zaduenog za
pretraivanjewebaupotrazizavampirima.
Action:android.intent.action.WEB_SEARCH
ExtraKey:query
ExtraValue:vampire
ActivityPackage:com.google.android.providers.enhancedgooglesearch
ActivityClass:com.google.android.providers.enhancedgooglesearch.Launcher
KomponentaBarcodeScannerzaduenajezajednostavnoitanjeobinihjednodimenzionalnih,ali
i sve popularnijih dvodimenzionalnih bar kodova (koritenjem metode DoScan, svojstva Result i
dogaaj AfterScan). Da je takva komponenta jednostavno neizostavna u modernim softverskim
rjeenjima, autor teksta moe posvjedoiti iz prve ruke. Na nedavno zavrenoj Microsoftovoj

konferenciji Windays 11 u Rovinju, osim oekivanih mjesta za takvu vrstu oznaavanja,


dvodimenzionalni bar kodovi su se mogli primijetiti i na majicama nekih sudionika. Naoruani
Android ureajem te odgovarajuom aplikacijom vie ne morate gubiti vrijeme da bi saznali
osnovne informacije o vlasniku majice. Umjesto toga u njegovom smjeru jednostavno uperite
kameruipogledatenazaslonusvetovameliodatiosebi.

Otherstuffkomponente:Ostalekomponentekojesekoristeurazvoju.
DvijekomponenteslinognazivaBluetoothServeriBluetoothClientzaduenesuzapodrkuobiju
strana koje sudjeluju u Bluetooth komunikaciji (servera i klijenta). Popis dostupnih metoda,
svojstavaidogaajajezbiljaimpresivan(baruusporednisdrugimkomponentamaizistogalata),a
potrebno je poznavati jo poneki detalj Bluetooth tehnologije, tako da se u ovom tekstu
jednostavnonemoemodetaljnijepozabavitinjihovimkoritenjem.Kakojepotpisnikovihredova
u bliskoj prolosti imao prilike raditi na Bluetooth orijentiranom projektu namijenjenom starim
dobrimJavaMIDPureajima,osobnomoepotvrditidajekoritenjeGoogletehnologijenaistom
podruju bitno jednostavnije. Budui da sami razvojni inenjeri tvrde da se na ovom segmentu
razvojnogalatajouvijekintenzivnoradi,ipaktrebamalosaekatisazavrnomocjenom.
KomponentaNotifieromoguava prikaz razliitih vrsti obavijesti korisniku aplikacije odnosno
trajno biljeenje takvih informacija u svrhu kasnije analize. Za to je pripremljeno nekoliko
metoda (ShowMessageDialog, ShowChooseDialog, ShowTextDialog, ShowAlert i LogError) ije
koritenjerezultirarazliitimnainomprikazainformacijakorisnikuodnosnonjihovombiljeenju.
Na raspolaganju su takoer dva dogaaja: AfterChoosing i ShowChooseDialog, kako bi se moglo
ustanovititojepoduzeokorisnikkaoreakcijunaprikazaneinformacijeodstraneaplikacije.
Zadnjedvijekomponenteizgrupe(SpeechRecognizeriTextToSpeech)zamiljenesukaopodrka
zaizradugovornoorijentiranogkorisnikogsueljauvlastitimAndroidaplikacijama.Prvakontrola
namijenjena je razumijevanju izgovorenog, dok je druga zaduena za suprotan proces

izgovaranje napisanog teksta. Koliko to sve skupa radi ili ne radi dobro s razliitim govornim
jezicima moete isprobati sami. Obje komponente su vrlo jednostavne za koritenje, jer se
primjenasvodinaupotrebujednostavnihmetodapoputGetText,Speek,CountryiLanguage.
Spomenimo na ovom mjestu kako se za izgovor napisanog teksta koristi ista Google tehnologija
koja je koritena u serijalu o naprednom programiranju Windows aplikacija, objavljenom u vie
prethodnihbrojevavaegomiljenogasopisa.
Notreadyforprimetimekomponente

Notreadyforprimetimekomponente:Eksperimentalnekomponenteuintenzivnojfazirazvoja.
U posljednoj grupi komponenti navedene su komponente na ijem razvoju jo uvijek intenzivno
radeGoogleovirazvojniinenjeri,pasukaotakvepodlonerazliitimpromjenamadoknestignuu
fazudovrenogproizvoda.Trenutnosuutugrupusvrstaneslijedeekomponente:
FusionTablesControlkoritenjekartografskihprikazaukombinacijisFusionTablestehologijom.
GameClient povezivanje aplikacija (najee igara) s odgovarajuim serverima za udruene
NEzloinakepoduhvate.
SoundRecorderbiljeenjeipohranjivanjezvunihzapisa.
TinyWebDBkomunikacijaswebservisimazbogdvosmjernerazmjenepodataka.
VotingosnovazabudueglasakelistieuAndroiddemokracijibudunosti.

Kako su sve nabrojane komponente iz ove grupe u razvoju, za sada se neemo previe ni baviti
njima. Ipak moramo priznati da nas strano zanima vrlo novi svijet u kojem emo praktino
trenutnomoiodluivatiobitnimstvarimauzemlji,aneekatidatoradimoodizboradoizbora.
Naalost,ipakbisemogliokladitinaprilinovelikeiznosekakoetakvutehnologijuprijeprihvatiti
razliitirealityspektaklinegodravnauprava.ivibilipavidjeli.
Ovime je zavreno predstavljanje najvanijih segmenata Googleovog razvojnog alata za
neprogramere. Preostalo je da pomou njega probamo napraviti jednu sloeniju aplikaciju kao
demonstracijukakorazliitekomponentesuraujuupraksi.

15.Izradasloenijihaplikacija

Nakon to smo u prolih nekoliko nastavaka predstavili najvanije dijelove Googleovog alata za
razvoj aplikacija namijenjenog korisnicima neprogramerima, odnosno malo manje vjetim
programerima, doao je trenutak da pokaemo kako se ti dijelovi zaista koriste u vlastitim
aplikacijama. Za razliku od prve demo aplikacije, kad smo vrlo detaljno rijeju i slikom opisivali
kako se izvode sve operacije potrebne da se dobije dovrena aplikacija, u dananjem nastavku
emosamonaznaitiglavnesmjerniceupripremiaplikacije,anavamajedaprobatesamidovesti
projekt u funkcionalno stanje. Tako emo odmah pripremiti i svojevrsnu vjebanju u koritenju
alata.
Iakosedanasmobilniureajikoristezaizvoenjeviedesetakarazliitihoperacijaodplaniranja
vlastitogvremena,prekosluanjamuzikeigledanjafilmovapasvedoigranjarazliitihvrstaigara,
mogunost izvoenja starog, dobrog telefonskog poziva (ili bar odgovaranja na njega) jo uvijek
ostajejednaodnajbitnijihnamjenaveinemobilnihtelefona.Zatoemouprvomprimjeruneto
sloenije aplikacije demonstrirati to moemo napraviti u Googlevom razvojnom alatu po tom
pitanju,akoneelimokoristitiveugraenemogunostiusamureaj.
PretpostavkazauspjenoizvoenjeslijedeeaplikacijenakonkretnomAndroidureajujedataj
ureaj podrava izvoenje telefonskih poziva, a ne samo razliite internet orijentirane naine
vlastitog koritenja (pregled web stranica, razmjena email poruka i slino). Takoer, u spremite
kontakatauureajutrebalobibitiupisanobarnekolikotelefonskihbrojeva,anekimaodbrojeva
trebalebibitidodijeljenjeslikenjihovihvlasnika.akiakosvinabrojenizahtjevibuduzadovoljeni,
moe se dogoditi da na nekim ureajima primjer ipak ne djeluje kako se oekuje. Razloge treba
traitiutometoutrenutnojfazirazvojaalatAppInventorforAndroidjouvijeknijenitestiranni
optimiziran za sve dostupne ureaje na tritu. Googleovi razvojni inenjeri obeavaju kako e
takve poroajne muke biti rijeene u bliskoj budunosti kad razvojni alat vie ne bude u fazi
svojevrsnogtestiranja.
ZauspostavutelefonskogpozivaizAndroidureaja,kaototoveznate,trebakreiratinoviprazan
projekt te mu dodijeliti nekakav naziv koji simbolizira namjenu projekta. U pripremi primjera
povezanogsovimtekstomkoritenjenazivVidiPhoneCall,alinemaapsolutnonikakvograzlogada
neodaberetenekidrugimnogorazumljivijinaziv(npr.APC4MMAndroidPhoneCallSystemfor
Modern Manager). Od dostupnih Android komponeti u projektu su nam na samom poetku

potrebnesamodvije:komponentaPhoneCallizgrupeSocialtekomponentaButtonizgrupeBasic.
UnastavkutekstaemoslinekonstrukcijeskraenopisatiSocial>PhoneCall,odnosnoBasic>
Button.

Social > Phone Call: Temeljna komponenta za izvoenje telefonskog poziva iz vlastite Android
aplikacije.
Svakoj komponenti postavljenoj na osnovni zaslon razvojni alat automatski dodjeljuju naziv
sastavljen od naziva komponente te rednog broja takve vrste komponente unutar projekta. U
sluaju jednostavnijih projekta takvi nazivi se mogu izravno koristiti za dovretak projekta, ali
dobrapraksaiskusnijihprogramerapredlaenjihovopreimenovanjeudalekorazumljivijenazive,
kako bi se kasnije olakalo snalaenje u projektu. to se u nekom projektu koristi vie razliitih
komponenti(tovrijediizasvedrugerazvojnealate),tojevanijeimatismislenijenazive,dabise
programertobreijednostavnijemogaosnaiunaknadnojanaliziiizmjeniprogramskogkoda.
Dobro,kodalataAppInventorzapravoninemoemogovoritibaopisanjuprogramskogkoda,
jer je prije rije o neemu nalik slaganju komada slagalice sastavljene od dostupnih dogaaja i
metoda koritenih komponeti, ali nema nikakvog razloga da ignoriramo pravilo o imenovanju
komponenti.
Preimenovanje komponente postavljene na osnovni zaslon projekta izvodi se njezinim
oznaavanjem,teklikomnagumb<Rename>urazvojnojokolinialata.Zapotrebeovogprojekta
komponentu PhoneCall1 preimenovali smo uTelefonskiPoziv, a komponetu Button1
uUspostaviPoziv.Jojednomponavljamobuduidabiradnaovomprojektutrebaoujednobiti
vaasamostalnavjebakoritenjaGoogleovograzvojnogalata,nazivekomponentimoeteizabrati
prema vlastitim sklonostima. Za komponentu TelefonskiPoziv moe se izmijeniti i poetna
vrijednostsvojstvaPhoneNumbernaeljenibrojpozivatelja(akosepozivinajeeupuujunataj
broj), dok komponenti UspostaviPoziv treba izmijeniti svojstvoText, kako bi zamjena za
podrazumijevanuvrijednostTextforButton1preciznijepokazivalanamjenugumba.

U ovom trenutku je dovreno crtanje korisnikog suelja, a sad preostaje jo samo to da se


napie odgovarajui programski kod, odnosno dovri slagalica u inovativnom Googleovom
suelju za tu namjenu (o ijem koritenju je bilo vie rijei u prvom nastavku serijala). Sasvim
konkretnouovomsluajupotrebnojenapravitipovezivanjeblokaClickizkontroleUpostaviPoziv
s blokomMakePhoneCalliz kontrole TelefonskiPoziv. Na taj nain dovrena je prva verzija
aplikacijekojaomoguavauspostavutelefonskogpozivaizAndroidureajasupisanimodredinim
brojemnakontokorisnikpritisnekontrolu(gumb)UspostaviPoziv.Djelovanjeprogramamoete
(iliipaknemoete)provjeritisaminavlastitomkomaduAndroidhardvera,veprematomekako
jeontrenutnopodranodstraneGoogleovihrazvojnihinenjera.
Na trenutnom stupnju razvoja nae nove aplikacije trebalo bi biti mogue uspostaviti telefonski
poziv, ali aplikacija jo uvijek nema pojma o podacima zapisanim u bazu kontakata u okviru
samog ureaja, nego se svi telefonski brojevi moraju upisivati u cijelosti. Budite iskreni pa
priznajte sami sebi koliko esto u praksi zaista izvodite operaciju upisivanja broja pozivatelja u
odnosuna uestalostbiranjadostupnihbrojevaizbazekontakata.Zatoaplikacijutrebadodatno
proirititakodapostanesvjesnaranijepripremljenihtelefonskihbrojeva.

Dovreno suelje aplikacije za telefoniranje: Omoguava koritenje podataka iz spremita


kontakatausamomureaju.
Udrugojverzijiaplikacijeemonaosnovnizaslonaplikacijedodatijojednunovukontrolu:Social
>PhoneNumberPicker,aondajojizmijenitipredloeninazivuIzaberiBroj,odnosnotekstkojise
prikazuje na kontroli s poetne vrijednostiText for PhoneNumberPicker1za hrvatsku verziju
aplikacijeprimjerenijioblikIzaberibroj.KontrolatipaPhoneNumberPickerpredstavljasvojevrsnu
verzijuobinoggumba,stomrazlikomdapritisaknakontroluautomatskiizazivaprikazpodataka
izpostojeebazekontakatauureaju.Kadsmonapisaliprikazpodataka,ondasmozaistamislili
samonato,jerodabirtelefonskogbrojaizprikazanihpodatakajouvijeknijemogu,barnetako
dugodokseponovonepripremiodgovarajuaslagalicazaupravljanjeizvoenjemprograma.

Da bi se na temelju izabranog podatka iz popisa kontakata zaista ostvario telefonski poziv,


potrebno je spojiti blokAfterPickingkontrole IzaberiBroj s blokomMakePhoneCalliz kontrole
TelefonskiPoziv. Potrebno je napraviti jo prijenos odgovarajueg parametra (izabranog
telefonskog broja) izmeu te dvije kontrole, to se izvodi dodatnim vezanjem
blokaPhoneNumberkontrole IzaberiBroj s prije navedenim blokom MakePhoneCall. Ovim
korakom, ako je sve pravilno izvedeno, trebala bi biti dovrena druga faza u razvoju aplikacije.
Sadajeaplikacijaspremnazaizvoenjetelefonskihpozivanatemeljuprijespremljenihpodatakau
bazukontakata.
U smislu poboljanja grafikog izgleda aplikacije mogue je u aplikaciju dodati jo poneki detalj.
Premdaseutrenutnojverzijibrojizbazekontakatazaistamoeizabratikaotemeljzatelefonski
poziv, korisnik aplikacije jo uvijek ne moe vidjeti o kojem je telefonskom broju rije. Da ne
spominjemo nemogunost prikaza slike vlasnika telefonskog broja, ako takva postoji u ureaju.
Unapreenje korisnikog suelja aplikacije moe se postii tako da se u okviru istog
blokaAfterPickingkontrole IzaberiBroj, naprave dva dodatna povezivanja. BlokPhoneNumberiz
kontrole IzaberiBroj treba povezati s blokomTextranije opisanog gumba UspostaviPoziv, a
blokPictureiz kontrole IzaberiBrojspojiti s blokomImage, takoer svojstvom gumba
UspostaviPoziv. Navedenim operacijama je aplikacija poboljana u vizualnom smislu pa osim
zahtijevanefunkcionalnostisadaposjedujeiodgovarajuekorisnikosuelje.
Trenutnaverzijaaplikacijaseidaljemoenadograivati,paevonekolikoidejakojemoeteprobati
napravitisami:
1. Osim prijenosa broja koji se poziva iz baze spremljenih kontakata, probajte prenijeti jo
nekepodatkenaosnovnizaslonaplikacije(prijesvegaprezimeiimekorisnika).Razmislite
prvotrebajulivamkakvedodatnekontrolenasuelju,dabitozaistamoglinapraviti.Ova
tokanebitrebalabitiprezahtijevnazarealizaciju.
2. Podaciouspostavljenimpozivimamoglibisesauvatizakasnijuanalizu.Kakojeuovom
sluajurijeomalozahtijevnijempostupku,onjemuevierijeibitinekidrugiput.
Na kraju, ambiciozniji itatelji mogu probati sami napraviti slian projekt ispoetka tako da se
umjesto uspostave telefonskog poziva izvodi slanje dobre, stare SMS poruke. U tom sluaju
temeljnukontroluzaradaplikacije(Social>PhoneCall),trebazamijenitineimdrugim,alivamto
sadaneemootkriti,negovamostavljamodanatemeljuprethodnihnastavakaserijalaivlastitog
eksperimentiranja sami pronae o emu je rije. U svakom sluaju preporuamo vam da sami
probateodraditicijeliposaookodananjeaplikacije,kakobimoglilakepratitislijedeiprojekt,
gdjeemojomanjedetaljiziratiokobiranjakontrolainjihovogkoritenjanegotojetobisluaj
danas.Buduidaemoraditinamnogosloenijemprojektujednostavnomoramopretpostavitida
suvamdobropoznateosnovnestvariokokoritenjaGoogleovogalatazaneprogramere.

16.Koritenjekartografskihservisa

U dananjem zavrnom nastavku svojevrsnog podserijala o koritenju Googleovog alata za brzo


prototipiranjeaplikacija,pokazatemokakoseuokvirutogalatakoristekartografskemogunosti
Googleovih servisa, jedne od najee koritenih tehnologija u aplikacijama na mobilnim
ureajima.Dodatnavrlozanimljivarazvojnatehnikademonstriranauistomprimjerujepozivanje
jedne Android aplikacije iz druge Android aplikacije. Ve smo nekoliko puta spomenuli kako je
trenutnojednoodnajveihogranienjaGoogleovograzvojnogalatazaneprogramereutometo
se unutar jedne aplikacije moe koristiti samo jedan raspored kontrola. Upravo sposobnou
pozivanja jedne aplikacije iz druge moe se zaobii spomenuto ogranienje. Nain koritenja
kartografskih servisa na kojem se temelji dananji tekst prikazan je u Googeovom primjeru
pripremljenomodstraneprofesoraDavidaWolberasasveuilitauSanFranciscu.
Prije nego to nastavimo s detaljnijim objanjavanjem primjera istaknimo na ovom mjestu jo
jednubitnumogunostoperativnogsustavaAndroidupogleduizraderjeenjakojesesastojiod
veeg broja sastavnih dijelova. Dok za pozivanje drugog dijela aplikacije iz poetnog dijela treba
koristitikomponentuActivityStarter,povratakunatragseizvodipotpunoautomatski.Dovoljnoje
samoizabratistandardnuoperacijuoperativnogsustavazatunamjenu,tojestodgovarajuutipku
nasamomureaju.

Prvidioaplikacije(suelje):Sastojiseodtriosnovnekontrole:Image1,ListPicker1iActivityStater1.
U prvom dijelu aplikacije na osnovni zaslon projekta postavljene su svega tri
kontrole:Image1,ListPicker1iActivityStater1. Kontrole su redom namijenjene za prikaz
poetneslikeprograma,izbortrijurazliitihodreditazaprikaznakarti,tenakrajukomponenteza
pokretanje dodatne kartografski orijetirane aplikacije. Prve dvije kontrole ne bi trebale biti

posebnotekezakoritenje,takodaihneemoniposebnoopisivati.Uostalom,kontroluzaprikaz
slikakoristilismoveuprvom,najtrivijalnijemprimjerukoritenjaalata.
NetovievremenaposvetitemokoritenjukomponenteActivityStarter,zatotoonazahtijeva
oblikznanjakakavjeuobiajenukrugovimapravihAndroidprogramera,alinijebauobiajenza
korisnike neprogramere. Drugim rijeima, druga komponenta cjelokupnog rjeenja mora se
pozvatiizprveprematonomdefiniranomprotokolu,tobiuovomsluajuimalootprilikeslijedei
oblik:
ActivityStartersvojstvoVrijednost
Actionandroid.intent.action.VIEW
ActivityClasscom.google.android.maps.MapsActivity
ActivityPackagecom.google.android.apps.maps

Prvi dio aplikacije (programski blokovi): Najvaniji dio povezan je aktivnostima kontrole
ActivityStarter.
Programskiblokovipovezanisaplikacijompodijeljenisuudvadijela.Prvidiojezajednosprateim
deklaracijamavrijednostimazaduenzapripremupoetnogizgledaaplikacije(vidiprateuslikuuz
tekst), dok se drugi izvodi nakon odabira neke od zadanih lokacija: Tour Eiffel, Musee du
LouvreiCathedraleNotreDame.Nakonodabirajednogodnavedenatrimjestaizpopisaprelazi
senaizvoenjeprogramskogblokaListPicker1.AfterPicking.
Naovommjestudolazimodomaledodatnekomplikacijapajetrebaobjasnitinetodetaljnije.Da
bisepomoukomponenteActivityStartermoglauspjenopokrenutidrugakomponentazaprikaz
nekogmjestanamapi,potrebnojekomponentiprenijetiadresuutonopropisanomformatu,ato

uovomsluajuznaipopunjavanjesvojstvaActivityStater.DataUri.Uspomenutosvojstvomorase
postaviti kombinacija vrijednosti geo:0,0?q=te konkretne vrijednosti za izabranu lokaciju iz
popisadostupnihmjesta(ListPicker1.Selection).Zatosekoristiposebniprogramskiblokzaduen
za rukovanje nizovima znakova (make text). U sluaju odabira druge od dostupnih vrijednosti
dobijesekonanavrijednost:geo:0,0?q=MuseeduLouvre.

Izvoenjeaplikacije:OsnovnioblikizvoenjaaplikacijeuAndroidemulatoru.
Sad je konano sve spremno za pozivanje drugog dijela aplikacije, pa prvi dio aplikacije zaista
predaje kontrolu izvoenja drugom dijelu na ranije opisani nain. Po elji se (to smo isto ve
spomenuli) moete vratiti na prvi dio koritenjem standardne operacije u operativnom sustavu
Android.
Sirovi oblik kartografskog prikaza kakav je u ovom trenutku prisutan u aplikaciji moe se dalje
nadograivatitakodasemoduluzaduenomzaprikazobjektamnogopreciznijezadanainprikaza
nekogmjestapremasintaksipropisanojodstraneGooglea.Naprimjer,zaznatnoatraktivnijinain
prikazasvihtrijulokacijamoglabisenavestimalosloenijeodrednice:
EiffelTower
http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=eiffel+tower&sll=37.0625,
95.677068
&sspn=48.909425,72.333984&ie=UTF8&hq=Tour+Eiffel&hnear=Tour+Eiffel,+Quai+Branly,+75007+
Paris,+IledeFrance,+France&ll=48.857942,2.294748&spn=0.001249,0.002207&t=h&z=19
MuseeLouvre

http://maps.google.com/maps?f=q&source=s_q&hl=en&q=louvre&sll=48.86096,2.335421&sspn=
0.002499,0.004415&ie=UTF8&t=h&split=1
&filter=0&rq=1&ev=zi&radius=0.12&hq=louvre&hnear=&ll=48.86096,2.335421&spn=0.002499,0.
004415&z=18
NotreDame,StreetView
ttp://maps.google.com/maps?f=q&source=s_q&hl=en&q=french+landmarks&sll=48.853252,2.349
111&sspn=0.002411,0.004415
&ie=UTF8&t=h&radius=0.12&split=1&filter=0&rq=1&ev=zi&hq=french+landmarks&hnear=&ll=48.
853252,2.349111&spn=0,0.004415
&z=18&layer=c&cbll=48.853046,2.348861&panoid=74fLTqeYdgkPYj6KKLlqgQ&cbp=12,63.75,,0,
35.58
Usluajudaeliteprovjeritisamikakosvetoskupalijepodjelujeupraksi,anemazenivremenani
voljedaispoetkarazvijatecijeluaplikaciju,moetekrenutilinijommanjegotporateusmjeritisvoj
pregledniknaadresuhttp://appinventor.googlelabs.com/learn/tutorials/maptour/maptour.html

Kontinuiranirazvojalata

Napredno izvoenje aplikacije: U prikaz su ukljuene dodatne opcije za prikaz slika na zadanoj
lokaciji.
UrazdobljuodprvogspominjanjarazvojnogalataAppInventorforAndroiduovomserijalu,pado
dananjegnastavka,Googleovirazvojniinenjerimarljivosuradilinanjegovimunapreenjima(a
radeidalje).Buduida serazvojaplikacijaizvodiizravnounekomod preglednikanijepotrebno

preuzimatinikakvenoveverzijealatadabiseiskoristiletenovosti,negosuoneodmahdostupne
imsealatslijedeiputpokrenenakonnjegovogauriranjanaGoogleovomserveru.
Osimispravkeuoenihpogreakaprijavljenihodstranekorisnika,izgledadasenajintenzivnijeradi
nadaljnjimdoradamakomponentiuokvirukolekcijeOtherStuff.KomponentaWebzamiljenaje
takodaosiguravadodatnemogunostiuizravnompreuzimanjupodatakaswebservera,zatose
do sada morao koristiti poseban Java kod (ili programski kod u nekom drugom programskom
jeziku) distribuiran na server. Sada je postalo mogue pozivati odreene skupine API funkcija
izravno preko Web komponente. Na primjer, koritenjem poziva funkcija iz Yahoo Finance API
bibliotekeprilinojejednostavnouAndroidaplikacijudodatiprikazrazliitihposlovnihinformacija
oijojpripremiipouzdanostibrineYahoo.
Iako to nema izravne veze s temom dananjeg teksta, za eventualno zainteresirane ipak
spomenimokakosesvepotrebneinformacijeokoritenjuYahooFinanceAPItehnologijenalazena
adresi:http://www.gummystuff.org/Yahoodata.htm

Webkomponentauakciji:IzravnokoritenjeYahooFinanceAPItehnologije.
Za sada toliko o ovoj temi. Nadamo se da vas je sve do sada napisano potaklo da ponete
razmiljatiorazvojuvlastitihAndroidaplikacija,akiakonisteprogramer,iliakotonikadanisteni
mislili postati. Kad savladate razvojni alat za neprogramere moda ete poeljeti da se u
budunostiponetebavitiipravimGoogleAndroidprogramiranjem.Nanjegaemoseponovo
vratitiuslijedeemnastavku,kakobipokazalijonekolikonaprednijihtehnikakoritenjaosnovnog
SDKalata.

17.tojenovou3.xizdanjima

Daovjekjednostavnonepovjerujekakovrijemebrzoletiodpoetkaserijalaoprogramiranju
koritenjem Googleovog razvojnog alata Android SDK, ve je prolo vie od godinu dana, a u
meuvremenu se je mnogo toga dobrog dogodilo sa samim alatom u smislu proirenja njegovih
mogunosti.Zatojeprijesvegazaslunapravaeksplozijapojavenovihmodelatabletraunala,jer
jeupravoonadoveladopotrebeoptimiziranjaAndroidsustavazatakvuvrstuhardvera.

NovostiualatuAppInventorforAndroid
Prije nego se pozabavimo osnovnim Android SDK razvojnim sustavom namijenjenom pravim
programerima,napiimonekolikododatnihrijeionajnovijimvijestimapovezanimsGoogleovim
alternativnim alatom za brzo prototipiranje aplikacija (App Inventor for Android), jer smo se
upravo njime bavili zadnjih nekoliko brojeva. Ako vam se alat dopao, pa zato planirate njegovo
dugoronijekoritenje,vanojeznatitovamoekujeubudunosti.
Prvo, i trenutno najvanije, kao novu web adresa za online koritenje alata App Inventor for
Android trebati e ubudue koristitiwww.appinventorbeta.comumjesto dosadanje
adreseappinventor.googlelabs.com. U duhu voenja brige za postojee korisnike vlastitih
proizvoda, uobiajenom kod velikih IT poduzea, sve postojee aplikacije registriranih korisnika
sauvane su i dostupne na novoj adresi, tako da nema potreba za nekakvim prepisivanjem
aplikacijasjedneadresenadrugo.

Android 3.x: Donosi brojne promjene u korisnikom suelju optimizirane za moderne tablet
ureaje.

Drugo, te jednako vano za budue koritenje alata, Google prestaje s izravnim radom na
odravanjuirazvojualataAppInventorforAndroid.Tonasreuneznaidaealatnestati,nego
da on prelazi u open source kategoriju. Za budui status alata brigu e voditi
novoosnovaniCenterforMobileLearninguokviruMITMediaLaba,tebitipodstalnimnadzorom
tri profesora s istog sveuilita:Hal Abelson, Eric KlopferiMitchel Resnik. Prva osoba iz
nabrojenetrojkezaslunajezapredlaganjeipokretanjeitavogprojekta2008godinezajednos
poduzeem Google, iz laboratorija drugog profesora potekla je prva verzija razvojnog alata, i to
upravo na temeljuideje zadnjeg imena s popisa. Dovretak cijelog postupka oekuje se do kraja
godine,apostojeikorisnicialataeredovitodobijatiinformacijeosvimpromjenama.

NovostiuosnovnomAndroidsustavu
NakonrazjanjavanjatrenutneibuduesituacijesalatomzabrzoprototipiranjeAndroidaplikacija,
vratimosesadanaosnovnirazvojnialatAndroidSDK.Odtrenutkapoetkapisanjaserijala,kojeg
upravo itate, razvojni alat je promijenio svoju prvu brojanu oznaku verzije s 2 na 3, to uvijek
znaidajedolodobitnihpromjenaunekomsoftverskompaketu.Kaotosmotovespomenuli
nasamompoetkuovogteksta,kljuniokidazatakvepromjenejesveopazaluenosttablet
raunalima,kakoodstraneproizvoaa,takoiodstranekorisnikamobilnihureaja.Buduidase
po dijelu svojih hardverskih karakteristika takvi ureaji razlikuju od mobilnih telefona, Android
sustavdoiviojebitnepromjenetosimboliziranovapoetnaoznakaverzije.
Pogledajmo prvo to se najvanijeg dogodilo sa stanovita krajnjeg korisnika. Najvanije su,
naravno,promjenenadimenzijamairezolucijizaslona,jersuovevrijednostiupraviludostavee
negokodmobilnihtelefona.Poveanjezaslonapretpostavkajezadodatnuzabavuukorisnikom
suelju,kakoupogleduredizajnapostojeihdijelova,takoiupogledudodavanjapotpunonovih
dijelova suelja poput sistemske ili akcijske trake. Kad govorimo o promjenama u korisnikom
sueljuondasetoodnosinadiovidljivnazaslonu,aliinasistemske,grafikiorijentiranemoduleu
pozadin,ikojisutakoermoralidoivjetibrojnepromjene.
Naveemzaslonuureajamoglaseizmeuostalogredizajniratisoftverskatipkovnicanamijenjena
unosuznakova.Tipkovnicajejednostavnopostalaudobnijatebrazakoritenjenegoprije,jerse
do dijela tipki vie ne mora dolaziti zaobilazno. Jo jedna bitna stvar povezana s korisnikim
sueljem je poboljana mogunost upravljanja operacijama oznaavanja, isijecanja, kopiranja i
umetanjateksta.Sadasezatuoperacijukoristedodatnestreliceprikazanenazaslonu.

Promjeneupoznatimaplikacijama:Naprimjer,aplikacijazaupravljanjeugraenomkamerom.
Prvaodprijespomenutihtraka,smjetenanasamomdnuzaslona,namijenjenajezabrzipristup
obavijestima, statusnim pokazateljima sustava te navigacijskim gumbima postavljenim na sam
zaslon.Upravilusistemskatrakadostupnajestalno,iakoseakojetobapotrebnomoesakritiu
sluajudanekaaplikacijatrebaiskoristiticijelidostupniprostorzaslona.Jojedanvaanzadatak
sistemsketrakejeupravljanjeviezadatkovnimradomprekopopisanedavnokoritenihaplikacija
(Recent Apps). Druga traka (akcijska) nalazi se na vrhu zaslona, a izgled i djelovanje ovise joj o
kontekstu izvoenja aplikacije, to znai da promjenom njezinog izgleda upravlja aplikacija, a ne
samAndroidsustav.
Od ostalih novosti svakako treba spomenuti nove mogunosti povezivanja tablet raunala s
vanjskim ureajima pomou Media/Picture Transfer Protocola, odnosno povezivanje prave
tipkovnice s ureajem kako bi se jo vie olakalo upisivanje teksta. Na kraju tu je i nekoliko
poboljanjastandardnihaplikacijapreglednik,elektronikapota,kamera,galerijaiimenik.Ujo
novijimverzijamanasljednicamasoznaka3.1i3.2uvedenasudodatnaunapreenjaukorisnikom
suelju te povezivanju s vanjskim ureajima (npr. razliiti dodaci za igru) i WiFi, dok je sam
Androidsustavoptimiziranzabrojnetabletureaje,kojisusenatritupojaviliumeuvremenu.
U ovom nabrajanju ne smijemo nikako zaboraviti na jo jednu promjenu, budui da ona nije
vidljivanaprvipogled,alipridonosiukupnomzadovoljstvukoritenjaAndroidplatforme.Osimto
uverziji3.xAndroidpodravaistovremenokoritenjeveegbrojaaplikacija,sadaseteaplikacije
mogu izvoditi i na veem broju procesora odnosno jezgri, ako je takva hardverska konfiguracija
ugraenaumobilniureaj.Androidureajitakoeuskoromoirjeavatinajsloenijeprobleme,a
danespominjemokakoedobronanjimaizgledatirazliiteigre.Umeuvremenususenatritu
zaistapojaviliviejezgreniureaji,takodaovovienijesamoteoretskamogunostsustava.
Sadkadsmoukratkonavelitojesvenovousustavusastanovitakrajnjegkorisnika,pogledajmo
totozapravoznaizaprogramere,akoelepisatioptimiziraneaplikacijezanoveverzijeAndrioda
s poetnom verzijom 3. Svaka nova verzija Androida sa sobom donosi izmijenjeno programsko
suelje s odreenim brojem novih poziva API funkcija, odnosno izmjene u nainu koritenja
postojeih funkcija. Budui da su se u verziji 3.0 (i novijima) pojavili potpuno novi dijelovi
korisnikogsuelja,kaotojeakcijskatrakailisistemskatraka,najvanijeAPIpromjenepovezane
su upravo s tim dijelovima. Drugim rijeima, dobili smo sasvim dovoljno grae za jo nekoliko
nastavakaserijalaukojimabisedemonstriralenajnovijemogunostiplatforme.
Navedimo sada primjer dijela programskog koda namijenje koritenju akcijske trake u vlastitim
aplikacijama,tektolikodasteknetedojamkakotoizgledaDetaljnijedjelovanjeprogramskogkoda
koji upravlja alatnom trakom, ali i drugim novostima verzije 3.x objasnit emo na sloenijem
primjerukojegpoinjemoizraivatislijedeiput.
packagecom.example.android.apis.app;
importcom.example.android.apis.R;
importandroid.app.ActionBar;
importandroid.app.ActionBar.Tab;
importandroid.app.Activity;

importandroid.app.Fragment;
importandroid.app.FragmentTransaction;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassActionBarTabsextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.action_bar_tabs);
}
publicvoidonAddTab(Viewv){
finalActionBarbar=getActionBar();
finalinttabCount=bar.getTabCount();
finalStringtext=Tab+tabCount;
bar.addTab(bar.newTab()
.setText(text)
.setTabListener(newTabListener(newTabContentFragment(text))));
}
publicvoidonRemoveTab(Viewv){
finalActionBarbar=getActionBar();
bar.removeTabAt(bar.getTabCount()1);

}
publicvoidonToggleTabs(Viewv){
finalActionBarbar=getActionBar();
if(bar.getNavigationMode()==ActionBar.NAVIGATION_MODE_TABS){
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE,ActionBar.DISPLAY_SHOW_TITLE);
}else{
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0,ActionBar.DISPLAY_SHOW_TITLE);
}
}
publicvoidonRemoveAllTabs(Viewv){
getActionBar().removeAllTabs();
}
privateclassTabListenerimplementsActionBar.TabListener{
privateTabContentFragmentmFragment;
publicTabListener(TabContentFragmentfragment){
mFragment=fragment;
}
publicvoidonTabSelected(Tabtab,FragmentTransactionft){
ft.add(R.id.fragment_content,mFragment,mFragment.getText());
}
publicvoidonTabUnselected(Tabtab,FragmentTransactionft){
ft.remove(mFragment);
}

publicvoidonTabReselected(Tabtab,FragmentTransactionft){
Toast.makeText(ActionBarTabs.this,Reselected!,Toast.LENGTH_SHORT).show();
}
}
privateclassTabContentFragmentextendsFragment{
privateStringmText;
publicTabContentFragment(Stringtext){
mText=text;
}
publicStringgetText(){
returnmText;
}
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
ViewfragView=inflater.inflate(R.layout.action_bar_tab_content,container,false);
TextViewtext=(TextView)fragView.findViewById(R.id.text);
text.setText(mText);
returnfragView;
}
}
}

You might also like