android skola programiranja android@vidi skola

91
8/10/2019 Android Skola Programiranja Android@Vidi Skola http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 1/91   ANDROID SKOLA PROGRAMIRANJA By android@Vidi Kopija teksta Android@Vidi skole programiranja za android sisteme Robert 12/3/2014

Upload: rgostecn

Post on 02-Jun-2018

298 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 1/91

 

 ANDROID SKOLA

PROGRAMIRANJABy android@Vidi

Kopija teksta Android@Vidi skole programiranja za android sisteme

Robert

12/3/2014

Page 2: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 2/91

SADRZAJ:

Android škola programiranja – Pisanje i pokretanje prvog programa .................................... 3

Treći nastavak serijala o Google Android programiranju – Interakcija sa korisnikom ............. 8

Android programiranje #4: Uvod u pisanje programskoga koda. ......................................... 12Android programiranje #5: Korištenje rasporeda kontrola u složenim aplikacijama ............ 18

Android programiranje #6: Korištenje osnovnih Android kontrola ....................................... 24

Android programiranje #7.................................................................................................... 31

Android programiranje #8: Android kontrole u akciji IV ....................................................... 35

Android programiranje #9: Korištenje datotečnog sustava .................................................. 40

Android programiranje #10: Nekoliko standardnih dijelova aplikacije ................................. 48Android programiranje #11: Standardni dijelovi aplikacije................................................... 59

Android programiranje #12: Alternativni pristup razvoju aplikacija ..................................... 65

Android programiranje #13: Alternativni pristup razvoju aplikacija II .................................. 69

Android programiranje #14: Alternativni pristup razvoju aplikacija III ................................. 73

Android programiranje #15: Izrada složenijih aplikacija ....................................................... 78

Android programiranje #16: Korištenje kartografskih servisa .............................................. 82Android programiranje #17: Što je novo u 3.x izdanjima ..................................................... 86

Page 3: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 3/91

Android škola programiranja –  Pisanje i

pokretanje prvog programa

Prošli put smo u malo poduţem početnom tekstu objasnili zašto pokrećemo novuškolu programiranja i koji su nam sve alati potrebni za nju, odnosno kako ih treba

instalirati na računalo da bi sve proradilo na odgovarajući način. Budući da je zarazvoj Google Android aplikacija potrebno instalirati nekoliko alata različitihproizvođača, takva instalacija nikad ne prolazi tako glatko kao kad je riječ o instalacijipojedinačnoga razvojnog alata samo jednog proizvođača. Ok, ako ste napravili sve što smo napisali u prošlom nastavku, sad biste trebali imati

računalo spremno za pisanje prvog Google Android programa, što ćemo doista inapraviti u nastavku teksta. Usput ćemo malo „zagrepsti“ po glavnim dijelovima

razvojne okoline potrebnim za razvoj takve vrste aplikacija, kao i samom emulatoru

odgovarajućeg hardverskog uređaja, jer na kraju krajeva, tek u njemu moţemovidjeti rezultate rada našeg programa na smisleni način. Nakon toga se u sljedećimbro jevima moţemo pozabaviti samim programiranjem i naprednijim programskim

tehnikama.

Stvaranje projekta HelloWorld: Ovako izgleda početni dijaloškiokvir kod stvaranja projekta

Kako rezervirani prostor za ovaj serijal u nekoliko brojeva

časopisa jednostavno nije dovoljan za detaljnije bavljenje razvojnom okolinom, tog

segmenta razvoja aplikacije dotaknut ćemo se samo kad nešto postane zaistaneophodno. Ipak, ako ste do sad već koristili neku od modenijih razvojnih okolina zarazvoj aplikacija (a napomenuli smo da praćenje serijala zahtijeva određenopredznanje), onda ne biste trebali imati previše problema ni sa snalaţenjem u

razvojnoj okolini Eclipse.

Kao što to dobra programerska tradicija nalaţe, priču o programiranju u GoogleAndroidu započet ćemo od trivijalnog HelloWorld primjera. Njegova namjena jestpokazati kako se u novom razvojnom okruţenju prikazuje jednostavna porukakorisniku programa. Za mlađe (ili starije) čitatelje koji moţda upravo sada prvi putzapočinju avanturu programiranja u nekom programskom jeziku, treba napisati

samo kratko objašnjenje zašto se u gotovo svakoj školi programiranja započinje stako trivijalnim primjerom budući da on sam za sebe zapravo ne radi ništa korisno.Ideja u pripremi tako jednostavnog primjera jest u tome da se programer što brţeupozna s novim programskim jezikom, ali i njegovim razvojnim okruţenjem, kako bise nakon toga što brţe moglo prijeći na sloţenije probleme. 

Page 4: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 4/91

  Za pisanje novog programa potrebno je u razvojnoj okolini Eclipse izabrati naredbu

File > New > Project te u dijaloškom okviru prikazanom u nastavku odabratiodgovarajuću vrstu projekta. U ovom slučaju to je Android Project. Kao rezultatizvođenja prethodne operacije, pojavljuje se dijaloški okvir New Android Project gdjese od programera očekuje upisivanje nekoliko polaznih podataka o vlastitomprojektu.

Project Name predstavlja naziv projekta na kojem trenutno radimo. U ovom slučaju,to će biti HelloWorld. Osim naziva projekta, potrebno je izabrati mjesto na disku zaspremanje njegovih sastavnih dijelova. To moţe biti podrazumijevana radna površinadefinirana prilikom prvog pokretanja radne okoline, neko točno određeno mjesto nadisku, ili se u razvoj projekta moţe krenuti od već postojećeg projekta – recimo

nekog od pratećih primjera Google Android projekata. Za sada na ovom mjestu

moţemo ostaviti podrazumijevane vrijednosti, dakle – uključene opcije Create New

Project in Workspace te Use default location.

Projekt HelloWorld nakon stvaranja: Automatski je generiran čitavniz datoteka koje se mogu pregledati u razvojnoj okolini Eclipse.

Projekt HelloWorld nakon stvaranja: Automatski je generiran

čitav niz datoteka koje se mogu pregledati u razvojnoj okoliniEclipse.

U slučaju da je na računalo instalirano više inačica razvojnih paketa Google Android

SDK, potrebno je izabrati jedan od njih, nakog čega će se odgovarajuća oznakainačice pojaviti u okviru Min SDK Version na dnu dijaloškog okvira. Da bi se moglonastaviti s radom na projektu, potrebno je navesti još nekoliko podataka. U okvir

Application Name treba upisati naziv aplikacije, što moţe biti bilo kakav niz znakova,dakle i onaj jednak nazivu projekta. U Package Name treba upisati naziv Java paketa.

Ovaj naziv treba biti sastavljen od najmanje dva dijela međusobno odvojena točkom– na primjer helloWorld.java (prema uobičajenim konvencijama prvo slovo treba bitimalo). U okvir Create Activity treba upisati naziv prve aktivnosti u Google Android

projektu – na primjer helloWorld.

Sada je moguće kliknuti na gumb Next te tako prijeći na sljedeći dijaloški okvirnamijenjen za stvaranje odgovarajućega pomoćnog projekta za testiranje. Projekti zatestiranje namijenjeni su za pojednostavljeno ponavljanje testiranja vrlo sloţenih

Google Android projekta (kakav HelloWorld zasigurno nije), ali ćemo na ipak kreiratitakav projekt kako bismo se upoznali i s tom mogućnošću razvojnog alata. Na ovommjestu mogu se ostaviti sve predloţene vrijednosti što za posljedicu ima stvaranjeprojekta HelloWorldTest. Nakon izvođenja svih prethodno nabrojenih operacija, u

Page 5: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 5/91

radnoj površini na disku stvara se čitava „hrpa“ datoteka, a sadrţaj svake od njihmoţe se vidjeti u odgovarajućem prozoru radne okoline. Za jednostavnije snalaţenjenajbolje je koristi hijerarhijski prikaz dijelova projekta u posebnom prozoru na

lijevom dijelu razvojne okoline (Navigator).

Upravljanje virtualnim uređajima: Omogućuje testiranje projektana različitim emulacijama hardverskih karakteristika. 

Budući da je razvojna okolina automatski pripremila čitav nizdatoteka, prva ideja koja nam svakako mora pasti na pamet

isprobavanje je nastale situacije. Najjednostavniji način za to jest odabir naredbe RunAs > Android Application iz padajućeg izbornika povezanog s projektom

HelloWorld. Podrazumijeva se da se ista naredba moţe izvesti na bar još nekolikonačina kao u svim modernim razvojnim okolinama – na primjer odabirom istoimene

naredbe iz glavnog izbornika ili odgovarajuće ikone na alatnoj traci prozora. Na tajdetalj više se nećemo vraćati ni u ovom ni u budućim tekstovima, nego istraţivanjealternativnih mogućnosti ostavljamo samim čitateljima. 

Budući da je cijeli Android sustav namijenjen razvoju aplikacija za prijenosnemobilne uređaje, razumljivo je da se aplikacija ne moţe izvesti „u zraku“, nego nam

 je za to potreban nekakav uređaj za njezino izvođenje – ako ništa drugo, onda bar uobliku softverske emulacije. Takav softverski „stroj“ naziva se Android Virtual Deviceili skraćeno AWD. Ako nekakva konfiguracija emulatora već ne postoji od prije, treba je pripremiti prema konkretnim potrebama za testiranje vlastite aplikacije. Za

upravljanje virtualnim uređajima koristi se dijaloški okvir Android SDK and AVDManager, što uključuje operacije poput stvaranja uređaja, njegovog brisanja,ispravljanja te moţda najvaţnije, pokretanja uređaja. Ključni hardverski parametri kojise mogu definirati kod stvaranja novoga virtualnog stroja jesu količina raspoloţive

radne memorije te rezolucija zaslona.Nakon stvaranja novoga virtualnog uređaja, u njega je moguće učitati, a nakon

toga i isprobati vlastitu aplikaciju. Budući da za sada naša aplikacija predstavlja samogoli kostur aplikacije te kao takva zapravo ne radi ništa pametno, ni u virtualnomuređaju nema se mnogo toga za vidjeti osim osnovne poruke korisniku programa. Uslučaju da se tekst iz aplikacije ne prikaţe automatski u virtualnom uređaju, kliknitena gumb Menu prikazan na prozoru virtualnog uređaja. 

Trenutno stanje programskoga koda ima oblik prikazan u nastavku, ali ne trebasmetnuti s uma da to nije jedini dio aplikacije. Tako, na primjer, za pregled i izmjenu

prikazane poruke treba otvoriti datoteku strings.xml, hijerarhijski smještenu u mapires/values.

Page 6: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 6/91

 package helloWorld.java;import android.app.Activity;

import android.os.Bundle;public class helloWorld extends Activity {

 /** Called when the activity is first created. */

@Override

 public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 }

 } 

Na sličan način, otvaranjem datoteke main.xls smještene u mapi res/layout, moţese oblikovati grafičko sučelje aplikacije na način vrlo sličan izvođenju odgovarajućihpostupaka u drugim modernim razvojnim okolinama – na primjer Microsoft Visual

Studio. Kao osnovnu vjeţbu u korištenju razvojne okoline, probajte u vlastitu

aplikaciju dodati jedan gumb te mu eventualno podesiti neka od svojstava za

određivanje izgleda u prozoru Properties. 

Virtualni uređaj u akciji: Stvarni izgled ovisi o parametrimadefiniranim prilikom njegovog stvaranja.

Vizualna priprema sučelja aplikacije: Izvodi se u posebnomprozoru radne okoline.

Spomenimo na ovom mjestu kako se čitava operacija prevođenja izvornoga koda,pokretanja virtualnog uređaja te učitavanja prevedenog programa u uređaj moţeopisati svakako, ali sigurno ne pojmom „brza operacija“, bez obzira na snaguračunala. Ako ste već ranije probali slične kombinacije razvojnih alata i emulatoradrugih proizvođača, onda sigurno niste iznenađeni prethodnom tvrdnjom, jer ste nato već jednostavno navikli. Dobra vijest je da je vrijeme učitavanja nove inačiceaplikacije u već pokrenuti virtualni uređaj bitno kraće, što znači da je isprobavanje

vlastite aplikacije nakon manjih promjena izvornoga koda ipak prilično bezbolanproces.

Page 7: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 7/91

  Spomenimo na kraju današnjeg predstavljanja početnih koraka u razvoju Androidaplikacija, jer se dovršena i testirana Android aplikacija moţe pripremiti zadistribuciju u obliku datoteke s nastavkom .apk. Riječ je o komprimiranoj datotecisastavljenoj od većeg broja datoteka koje sadrţe sve potrebne informacije za

izvođenje aplikacije na uređaju s ugrađenom podrškom za Google Android. Kadzavršite ovu školu i napišete prve kvalitetne aplikacije, prruţa vam se mogućnost daponešto i zaradite putem online trgovine Google Android aplikacija, kojasvakodnevno dobiva sve veći broj naslova od programera širom svijeta. 

Page 8: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 8/91

Treći nastavak serijala o Google Androidprogramiranju –  Interakcija sa korisnikom

Drugi nastavak nove škole programiranja u razvojnom alatu Google Android bio jenamijenjen izradi „klasične aplikacije“ u svim školama programiranja – općepoznatogprimjera HelloWorld. Cilj projekta bio je brzo upoznavanje dijelova razvojne okolinepotrebnih za izradu vlastitih aplikacija, dok o samom programiranju nije bilo rečenobaš mnogo. U biti, u prošlom tekstu samo smo isprobali ono što je automatskipripremila razvojna okolina. Ovaj put idemo korak dalje pa počinjemo u početnuaplikaciju dodavati prve objekte, a nakon toga i programski kod za njihovu reakciju

na događaje u okolini, to jest na operacije korisnika programa. Usput ćemo se malopozabaviti i posebnom terminologijom koja se koristi tijekom rada na Google

Android projektima.

Prije nego počnemo „zaozbiljno“, dopustite da se osvrnemo na bitan tehnički detalj.Moderna razvojna okolina kao što je Eclipse ima čitav niz prozora za definiranjerazličitih dijelova projekta, pa se početniku nije baš uvijek lako snaći sa svim timdijelovima, posebno ako je neki od bitnih prozora zatvoren ili premješten spodrazumijevanog mjesta slučajno ili namjerno. Kako bi olakšao praćenje teksta,autor se trudi da priloţene slike uz tekst uvijek pokazuju bitne dijelove. Problemnastaje kad se zbog ovog ili onog razloga (najčešće nedostatka prostora u časopisu),neka od slika mora izostaviti, ili se smanji tako da je teško razaznati neke dijelove.

Zato ćemo (bar u početku) stalno navoditi ne samo što treba napraviti da bi sedovršila neka operacija nego i kako se zapravo stiţe do tog mjesta. 

Navedimo prvo što ţelimo postići u današnjem i sljedećem nastavku. U osnovniprojekt, HelloWorld, iz prošlog nastavka ţelimo dodati tri nova objekta – jedan okvir

za prikaz i unos teksta od strane korisnika te dva dodatna gumba za upravljanje tim

okvirom. Odmah pri pokretanju programa okvir za tekst se programski puni

početnom vrijednošću, a pritisak mišem na bilo koji od dodatna dva gumba izaziva

zamjenu početnog sadrţaja drugačijim tekstom. Dakle, ništa spektakularno u smisluizvođenja programa, ali i tako jednostavan primjer demonstrira različite načinekorištenja Google Android sustava u razvoju aplikacija zamobilne uređaje. 

Rad na proširenju početnog HelloWorld projekta započinjemootvaranjem datoteke main.xml u prozoru radne okoline, pod

nazivom Android Layout Editor, jer je on namijenjen grafičkom 

uređivanju izgleda vlastite aplikacije. Naravno, budući da je u

osnovi riječ o običnoj .xml datoteci, moţemo je otvoriti i unekom od tekstualno orijentiranih prozora, ali se to baš ne

preporučuje početniku. Na ovom mjestu postoji velik stupanj analogije sa stvaranjem

Page 9: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 9/91

HTML dokumenata (što je vjerojatno poznato bar dijelu čitatelja). HTML dokumentmoţemo stvoriti izravnim upisivanjem sastavnih dijelova u tekstualnom obliku (teţinačin), ili njihovim „crtanjem“ u odgovarajućem grafički orijentiranom alatu (lakšinačin). Za sada ćemo i u razvojnoj okolini Eclipse izabrati lakši način izradekorisničkog sučelja, a kad postanete iskusniji, moţete koristiti oba načina.

Spomenimo na ovom mjestu namjenu prozora Outline, koji zapravo predstavlja

„nešto između“. U njemu je vidljiv samo popis osnovnih dijelova od kojih se sastoji

korisničko sučelje aplikacije, kao i njihov međusobni odnos, ali ne i drugi detalji zaodređivanje izgleda. Korisničko sučelje aplikacije iz prošlog nastavka bilo jesastavljeno od svega dva dijela: LinearLayout i TextView. Prvi dio pripada grupi

objekata namijenjenih određivanju međusobnog rasporeda osnovnih objekata kojičine korisničko sučelje (u terminologiji Google Androida to su layouts objekti). Udanašnjem nastavku nećemo se detaljnije baviti ovim dijelom oblikovanja

korisničkog sučelja, nego to ostavljano za buduće nastavke serijala. Za sadaspomenimo samo da je tijekom inicijalne pripreme projekta uporabljen prilično jednostavan raspored objekta pod prije spomenutim nazivom LinearLayout, a mi

ćemo ga zasad koristiti bez ikakvih izmjena. U projekt HelloWorld automatski jedodan još jedan objekt namijenjen osnovnoj interakciji s korisnikom programa, štose zapravo svodilo na običan prikaz pozdravne poruke. U terminologiji GoogleAndroida, takvi objekti s vlastitim vizualnim izgledom, namijenjeni izgradnji različitihdijelova korisničkog sučelja za interakciju s korisnikom aplikacije – nazivaju se

widgets.

Već smo spomenuli da ćemo u korisničko sučelje dodati joštri dijela pa sad prelazimo na izvođenje odgovarajućihoperacija. Iz prozora Views treba redom povući tri objekta nadio koji prikazuje grafičku reprezentaciju aplikacije (objektLinearLayout). Jednom to treba napraviti s objektom tipa

EditText, a dva puta s objektom tipa Button. O samom mjestu

„ispuštanja“ objekta ne treba voditi previše računa, jer sepozicioniranje nacrtanih objekata ionako izvodi automatski

zbog korištenja vrlo jednostavnog načina raspoređivanja objekata. Primijetimo naovom 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 inačicu Microsoftove razvojne okoline, bit će vampotpuno jasno što se je dogodilo u prethodnom koraku.

Isto tako, prepoznat ćete način za pregled i izmjenu podrazumijevanih vrijednosti

svojstava aktivnog objekta. Za to se koristi prozor Properties, a u njemu treba jednostavno pronaći svojstvo čiji sadrţaj namjeravamo izmijeniti te upisati (ili izabrati

što ovisi o vrsti svojstva) novu vrijednost. Na primjer, ako ţelimo boju cjelokupnepozadine izmijeniti s crne na bijelu, kao aktivan objekt treba označiti LinearLayout, a

Page 10: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 10/91

kao vrijednost svojstva Background upisati vrijednost #FFFFFF. Na sličan načinmoţemo gumbima Button01 i Button02 izmijeniti početni tekst na vrijednost Prihvatiodnosno Odbaci, tako da za svaki gumb izvedemo korekciju vrijednosti svojstva Text.

Objektu EditText01 također izmijenimo vrijednost svojstva Layout width na unaprijeddefiniranu vrijednost fill_parent, kako bi se objekt proširio na punu širinu. Za vjeţbu,moţete promijeniti početnu vrijednost prikazanog teksta na objektu EditText01, iakoćemo to kasnije napraviti programski, kako bismo demonstrirali izmjenu vrijednostisvojstava u programskom jeziku.

Nestrpljivi čitatelji mogu probati sami otkrivati čemu sluţedruga dostupna svojstva tako da im izmijene početnuvrijednosti, a mi ćemo u sljedećim nastavcima serijalaobjašnjavati neka od njih kad nam zatrebaju. Objasnimo na

ovom mjestu nešto zaobilazniji način za izmjenu vrijednosti

svojstava. Vrijednost #FFFFFF na prvi, drugi pa čak i treći pogledpočetniku ne odaje da je riječ o bijeloj boji, a priznat ćete da ni

iskusnijima nije baš lako pamtiti slične vrijednosti, ako ih ne koriste svakodnevno.

Postoji li način da se takve vrijednosti koriste na „humaniji“ način? Srećom, da, aodgovarajući postupak opisujemo u nastavku teksta. U hijerarhijskom pregledu dijelova projekta (prozor Navigator) treba pronaći i

otvoriti datoteku res \ values \ strings.xml. U ovoj datoteci nalaze se definicije

resursa uporabljenih na različitim mjestima u programu. Na ovo mjesto treba

 jednostavno dodati novi resurs pod nazivom BijelaBoja. Za to se koristi klik na gumbAdd.., nakon čega se otvara dijaloški okvir za odabir kategorije resursa. U njemusasvim logično treba izabrati kategoriju Color, iako se potpuno sličan postupakprimjenjuje za druge vrste resursa. Preostaje još samo da se kao naziv resursa(Name) upiše vrijednost BijelaBoja, a kao njegova vrijednost (Value) #FFFFFF.

Naravno, nemojte zaboraviti ni na spremanje nove vrijednosti resursa pomoću ikonediskete na alatnoj traci razvojne okoline.

Ako sada zatvorimo datoteku strings.xml, vraćamo se ponovno na grafičkureprezentaciju korisničkog sučelja. Ponovno kao aktivni objekt izaberimoLinearLayout te pronađimo svojstvo Background. Nakon klika na gumb s tri točke nasamom desnom kraju reda, otvara se dijaloški okvir Reference Chooser. U njemumoţemo pronaći vrijednost BijelaBoja u okviru kategorije Color 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, alisada napisanu na mnogo čitljiviji način od upisa heksadecimalnoga koda iste boje.

Na sličan način moţemo definirati druge vrijednosti koje namjeravamo uporabiti urazličitim dijelovima programa. 

Page 11: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 11/91

Za kraj ovoga poglavlja, otvorimo ponovno datoteku main.xml, ali sada u običnometekstualnom editoru. Dobit ćemo nešto poput: 

<?xml version=”1.0″ encoding=”utf -8″?> 

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” 

android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:background=”@color/BijelaBoja”> 

<TextView

android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”@string/hello”  />

<EditText android:text=”@+id/EditText01″ android:id=”@+id/EditText01″

android:layout_height=”wrap_content”android:layout_width=”fill_parent”></EditText> 

<Button android:id=”@+id/Button01″ android:layout_height=”wrap_content”android:onClick=”myClickHandler” android:layout_width=”wrap_content”android:text=”Prihvati”></Button> 

<Button android:id=”@+id/Button02″ android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:onClick=”myClickHandler”android:text=”Odbaci”></Button> 

</LinearLayout>

Sve ono što smo ranije dobili grafičkim oblikovanjem sučelja unekoliko prozora razvojne okoline, ovdje je prikazano u običnomXML formatu zapisa. Iskusniji programeri mogu na ovom mjestu

izravno izvoditi promjene, pa čak i dodavanje novih objekata nasučelje. Na primjer, probajte jednostavno umnoţiti dio tekstanamijenjen definiranju gumba Button02 pa ćete dobiti još jedan

identičan gumb na korisničkom sučelju. Primijetimo na kraju današnjeg nastavka da u XML opisu oba gumba postoji vezaprema programskom kodu za obradu događaja onClick, jer je autor teksta to većpripremio u primjeru, ali zbog zadane veličine svakog pojedinog nastavka serijala, o

tome će nešto više riječi biti u sljedećem broju. 

Page 12: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 12/91

Android programiranje #4: Uvod u pisanje

programskoga koda.

U prošlom, trećem poglavlju Google Android programiranja, u početnu inačicuaplikacije HelloWorld dodali smo nekoliko osnovnih grafičkih objekata, te usput

objasnili više bitnih dijelova razvojne okoline Eclipse, povezanih s postavljanjem ipregledom grafičkih objekata korištenih u aplikaciji, odnosno pripremom i izmjenom

njihovih svojstava. Međutim, tako dugo dok nacrtanim objektima ne dodamonekakav programski kod, oni u aplikaciji sluţe manje-više samo kao ukras, pa kaotakvi ne rade ništa pametno. Tek kada se objektima pridruţe odgovarajuće funkcijeza reakciju objekta na „podraţaj“ iz okoline (recimo pritisak na objekt od stranekorisnika aplikacije na zaslonu uređaja), počinje se doista nešto događati. 

Vratimo se na trenutak ponovno na tekstualni prikaz dijela datoteke main.xml,zaduţene za definiranje izgleda objekata u aplikaciji, ali istovremeno i za povezivanjenacrtanih objekata s dijelovima programskoga koda. Usredotočimo se u nastavku nasljedeće dijelove datoteke: <?xml version=”1.0″ encoding=”utf-8″?> 

… 

<Button android:id=”@+id/Button01″

android:layout_height=”wrap_content”android:onClick=”myClickHandler” android:layout_width=”wrap_content” android:text=”Prihvati“></Button> 

<Button android:id=”@+id/Button02″ android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:onClick=”myClickHandler” androi

d:text=”Odbaci“></Button> 

… 

Povezivanje objekata s programskim kodom: Izvedivo je izravnim

uređivanjem tekstualnog sadrţaja datoteke Main.xml. 

Dijelovi označeni istaknutim pismom zaduţeni su za povezivanjeoba „nacrtana“ gumba u sučelju s odgovarajućom funkcijom u

programskom kodu – u ovom slučaju ona je zaduţena za obradu događajaizazvanog pritiskom korisnika na kontrolu. Da odmah razjasnimo jednu vrlo bitnu

stvar (kako se čitatelji ne bi našli u svojevrsnoj konfuziji pri praćenju teksta), iako smo

 je već spomenuli na kraju prethodnog nastavka. Ako se pozorno pratili tekst izprošlog broja te pokušali ponoviti sve opisane operacije, onda u vašem projektutrenutno nema navedenih dijelova. U projektu autora teksta ti dijelovi postoje, jer je

primjer prvo napravljen do kraja, a tek onda je započeto pisanje teksta. Odatle dolazi

Page 13: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 13/91

do istaknute razlike između projekata, ali ćemo odmah poduzeti sve potrebneoperacije da ih uklonimo.

Na koji način u vlastite projekte moţete dodati dio koji nedostaje? Jedan od načinaizravni je upis prije označenoga teksta u prozoru zaduţenom za tekstualni prikazsadrţaja datoteke main.xml. Drugi način korištenje je prozora Properties, nakon štoţeljeni objekt postane aktivan objekt (vidi priloţenu sliku uz tekst). U našem primjeruoba objekta povezana su s istim dijelom programskog koda, jer se u njemu na

 jedinstven način prvo provjerava objekt na koji je korisnik programa napraviopritisak. Moguće je napraviti i drugačije rješenje. Svaki gumb moţe biti povezan sposebnom funkcijom za obradu događaja. Na autoru programa je odlučiti što jenajbolje izabrati u određenoj situaciji. Pripadajući programski kod primjera u ovom trenutku ima sljedeći oblik (datoteka

HelloWorld.java):

package helloWorld.java;import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.os.Bundle;

public class helloWorld extends Activity {

private EditText text;

 /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

text = (EditText) findViewById(R.id.EditText01);

text.setText(“No button pressed”); 

}

 // Will be connected with the buttons via XML

public void myClickHandler(View view) {

switch (view.getId()) {

case R.id.Button01:

text.setText(“Button 1 was clicked”); 

break ;case R.id.Button02:

text.setText(“Button 2 was clicked”); 

Page 14: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 14/91

break ;

}

}

}

U prethodnom primjeru mogu se uočiti tri glavna dijela. Prvo je naveden čitavniz import naredaba kako bi se u vlastiti program uključili svi potrebni dijelovi zaizvođenje aplikacije. Pomoću dijela: public void onCreate(Bundle savedInstanceState) {

započinje drugi dio, odnosno izvođenje glavnog dijela programa. U njemu se, osiminicijalizacije same aplikacije, postavlja početna vrijednost tekstualnog sadrţaja zatrenutno jedini objekt u aplikaciji zaduţen za prikaz odnosno unos teksta(EditText01). Za to su zaduţene naredbe za njegovo „pronalaţenje“ među

postojećim objektima, a nakon toga za postavljanje početne vrijednosti. setContentView(R.layout.main);

text = (EditText) findViewById(R.id.EditText01);

text.setText(“No button pressed”); 

Kao što smo to već spomenuli, u ovom primjeru oba gumba u aplikaciji povezanasu na zajednički dio programskoga koda za obradu događaja. 

Alternativni način povezivanja: Korištenje prozora Properties urazvojnoj okolini Eclipse.

Pomoću naredbe switch provjerava se o kojem je gumbu

doista riječ, a onda se izvodi jedan od dva moguća nastavka.Svaki od njih izaziva prikaz drugačije poruke u prije spomenutomu tekstualnomokviru. Ako je sve napravljeno precizno, prema uputama iz ovog i prethodnog

nastavka serijala, ti jekom izvođenja programa trebali biste dobiti identičnoponašanje programa kao na slikama uz tekst. Pokupajmo sada u svrhu svojevrsne vjeţbe opisati sve potrebne izmjene kako bi uprogramskom kodu primjera svaki gumb imao vlastitu proceduru za obradu

događaja. U praksi je to zapravo češće rješenje zbog velike razlike između namjenepojedinih gumba u aplikaciji. Postojeći programski kod primjera helloWorld.java utom slučaju treba izmijeniti u sljedeći oblik. 

Page 15: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 15/91

package helloWorld.java;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.os.Bundle;

public class helloWorld extends Activity {

private EditText text;

 /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

text = (EditText) findViewById(R.id.EditText01);

text.setText(“No button pressed”); 

}

 // first Button

public void myClickButton1(View view) {

text.setText(“Button 1 was clicked”); 

}

 // second Button

public void myClickButton2(View view) {

text.setText(“Button 2 was clicked”); 

}

}

Početni izgled prozora: Nakon pokretanja programa pojavljuje sepočetna poruka. 

Budući da zajednička funkcija za obradu događaja nakon pritiskana gumb više ne postoji, nego je zamijenjena s dvije pojedinačne

funkcije, treba korigirati veze između oba gumba i pripadajućega programskogakoda. To se ponovno moţe napraviti izmjenom svojstva On click  u

prozoruProperties te upisivanjem

vrijednosti myClickButton1, odnosnomyClickButton2. Klikom na gumb na krajnjoj

Page 16: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 16/91

desnoj strani toga reda moţe se prikazati i dijaloški okvir za odabir postojećihdijelova programskoga koda. Alternativni način za izvođenje iste operacije (neštobrţi, ali zahtijeva veću preciznost u pisanju) izravna je izmjena tekstualnog sadrţajadatotekemain.xml. U konačnici, bez obzira na uporabljeni način izmjene vrijednosti,u toj datoteci treba biti sljedeći sadrţaj. <?xml version=”1.0″ encoding=”utf-8″?> 

… 

<Button android:id=”@+id/Button01″ android:layout_height=”wrap_content”android:layout_width=”wrap_content”android:text=”Prihvati” android:onClick=”myClickButton1″android:scrollHorizonta

lly=”false”></Button> 

<Button android:id=”@+id/Button02″ android:layout_width=”wrap_content”android:layout_height=”wrap_content”

android:text=”Odbaci” android:onClick=”myClickButton2″></Button>… 

Ovime je dovršen početni niz tekstova o razvoju aplikacija pomoću Google Androidplatforme. Ako ste pozorno pratili sve što je do sada napisano o ovoj temi, sadabiste na vlastitom računalu trebali imati pravilno instaliran razvojni sustav, a ujednobiste ga trebali poznavati do razine korištenja koja omogućuje praćenje i upisprimjera iz sljedećih nastavaka serijala. Kao i obično u školama programiranja,

praćenje tekstova olakšat ćemo izdavanjem pratećih primjera na digitalnomu medijuuz časopis. 

Što ćemo raditi u budućim nastavcima? Zbog relativne ograničenosti prostora zaovaj serijal u časopisu,  škola programiranja u razvojnom alatu Google

Izgled prozora nakon klika na prvi gumb: Početna porukazamjenjuje se novom porukom.

Android dalje će izgledati nešto drugačije nego što je to bioslučaj s prethodnim sličnim materijalima istog autora. To znači

da nećemo obrađivati segment po segment programskoga jezika ni pratećihbiblioteka funkcija, a onda izmišljati odgovarajući primjer za njihovu demonstraciju,nego ćemo raditi upravo obrnutim redoslijedom. Prvo ćemo napraviti jedan ili višesloţenijih primjera namijenjenih demonstraciji različitih mogućnosti Google Android

platforme, a onda objasniti što rade ključni dijelovi primjera. Kao što smo istaknuli nasamom početku serijala, za praćenje tako koncipiranih nastavaka očekuje seodređeno predznanje u smislu poznavanja osnovnih pojmova uobičajenih uprogramerskom ţargonu, poput varijable, petlje ili procedure. Drugim riječima, to bi

Page 17: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 17/91

trebalo značiti da već posjedujete osnovno praktično znanje programiranja u nekomdrugom razvojnom alatu.

U međuvremenu, dok čekate sljedeći bitno kompliciraniji nastavak serijala, moţetesami pokušati dodati u projekt nekoliko novih gumba ili drugačijih vrsta kontrola, aonda ih povezati s osnovnim događajem na korisničkom sučelju (On click ).

Page 18: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 18/91

Android programiranje #5: Korištenje rasporedakontrola u složenim aplikacijama 

Nakon što smo prošli put „dotjerali do kraja“ s nešto sloţenijim Android projektomu kojem je bilo i malo više programskog koda, došao je trenutak da se detaljnije

pozabavimo najvaţnijim dijelovima razvojnog alata, kako bi u slijedećim nastavcimamogli izrađivati ozbiljnije aplikacije. Jedna od tipičnih karakteristika svake sloţenijeaplikacije, bez obzira na softversku platformu na kojoj se izvodi, je postojanje većegbroja prozora, formi ili zaslona (već prema terminologiji uobičajenoj za tu razvojnuplatformu) u okviru iste aplikacije. Ni Android aplikacije po tom pitanju nisu nikakav

izuzetak.

U dosadašnja dva jednostavna primjera aplikacija iz prethodnih nastavaka serijala

koristili smo isti pogled (odnosno istu vrstu rasporeda osnovnih objekata) podnazivom LinearLayout. U tim primjerima zapravo se nismo previše obazirali nakarakteristike korištenog rasporeda kontrola, nego smo jednostavno po njemupostavili ostale objekte korištene u aplikaciji (dva gumba i jedan okvir za unosteksta). Glavna tema današnjeg teksta posvećena je upravo različitim vrstamarasporeda osnovnih kontrola dostupnim u okviru Android platforme, što uključujeopisivanje njihovih mogućnosti i načina korištenja. U okviru Google Android platforme dostupne su slijedeće vrste rasporeda osnovnih

objekata:

1.  LinearLayout

2.  AbsoluteLayout

3. 

TableLayout

4. 

RelativeLayout

5. 

FrameLayout

6. 

ScrollView

Početni raspored osnovnih kontrola: Koristi se podrazumijevaniraspored osnovnih kontrola LinearLayout.

Prije nego što malo detaljnije objasnimo svaki od rasporeda,posvetimo riječ, dvije izvornoj terminologiji te hrvatskim

pojmovima korištenim u tekstu. U originalnoj terminologiji osnovni objekti (npr.

gumb, okvir za tekst i slično) nazivaju se Widget, a kad su vidljivi na zaslonu View.PojmomViewGroup (u osnovi također posebnoj vrsti pogleda) označava se skupinaosnovnih „Viewa“ razmještena po zaslonu u određenom rasporedu – to je ovih 6

rasporeda spomenutih u prethodnom nabrajanju. Sad kad smo nabrojili temeljne

Page 19: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 19/91

engleske pojmove navedimo i to koje ćemo prijevode koristi u nastavku teksta da nestvaramo nepotrebnu zabunu. Umjesto pojmova Widget i View koristit ćemo riječiobjekt ili kontrola, dok će ViewGroup biti zamijenjen s pogled ili raspored kontrola.

To moţda nije najbolje moguće rješenje prijevoda, ali s druge strane predstavlja vrločestu terminologiju korištenu u opisu drugih razvojnih alata. Ako ste već koristili nekiod njih, bez problema ćete pratiti rečenice u tekstu kojeg upravo čitate. Vratimo se sada na glavnu temu današnjeg teksta – korištenje različitih rasporedaosnovnih kontrola u vlastitim aplikacijama. Obavimo to istim redom kao u ranijem

nabrajanju.

LinearLayout predstavlja osnovni raspored kontrola gdje su sve osnovne kontrole

raspoređene u samo jednom redu ili samo jednom stupcu. Tijekom rada na osnovnadva projekta u prethodnim nastavcima, nove kontrole su se uvijek pojavljivale jedna

ispod druge, jer smo koristili upravo taj osnovni raspored kontrola automatski

predloţen od strane razvojne okoline tijekom stvaranja projekta. Iako za sloţenijeaplikacije ovakav raspored osnovnih kontrola nije uvijek i najpogodnije rješenje, kodpočetnih koraka u novom razvojnom alatu zapravo nema nekih prevelikih zamjerki

na njegovo korištenje. Kod drugog od spomenutih rasporeda kontrola AbsoluteLayout programer nije

ograničen na neki od podrazumijevanih oblika „redanja“ osnovnih kontrola popozadini, nego ima potpunu slobodu u njihovom postavljanju na dostupnom

području. O samim svojstvima potrebnim za pozicioniranje svake pojedine kontrole

na ovakvoj vrsti pogleda odnosno rasporeda, bit će više riječi slijedeći put. Raspored kontrola pod nazivom TableLayout, kao što to sam naziv govori, koristi sekod razvrstavanja osnovnih kontrola u više redova ili stupaca tablice, odnosno učelije tablice. Na taj način mogu se dobiti „lijepi“ pravilni rasporedi osnovnih kontrolana pogledu, što se vrlo često koristi kod različitih vrsta unosa podataka uaplikacijama.

U RelativeLayout rasporedu kontrole se mogu postaviti na različita mjesta nadostupnom prostoru za njihovo prikazivanje, ali točno mjesto svake kontrole nije

određeno njezinim apsolutnim koordinatama kao kod rasporeda pod nazivomAbsoluteLayout, nego je pozicija osnovne kontrole definirana relativnim

koordinatama prema drugoj osnovnoj kontroli.

FrameLayout se u aplikacijama koristi za rezerviranje mjesta za naknadno

postavljanje drugih kontrola tako da se one uvijek „sidre“ prema gornjem lijevomuglu FrameLayout rasporeda kontrola. Sve će biti jasnije kad se to prikaţe slikom unekoj od budućih aplikacija. Zadnja vrsta rasporeda osnovnih kontrola pod nazivom ScrollView koristi se u

slučajevima kad na fizičkim dimenzijama zaslona jednostavno nije moguće prikazatisve potrebne osnovne kontrole na smislen i pregledan način (bez međusobnogpreklapanja i jasnog razdvajanja). Pogled ScrollView zapravo predstavlja posebnu

Page 20: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 20/91

vrstu rasporeda FrameLayout na koju se u praksi obično postavlja dodatna vrstaosnovnog rasporeda kontrola (RelativeLayout).

U okviru jedne sloţene aplikacije moţe se koristiti veći broj istih ili različitih vrstarasporeda kontrola, između kojih se prebacivanje, to jest aktiviranje nekog drugograsporeda, izvodi pomoću programskog koda. Pogledajmo sada kako korištenjarazličitih rasporeda izgleda na nekoliko primjera. 

Osnovni raspored kontrola iz dovršenog primjera u prethodnom nastavku, koji jekoristio podrazumijevani raspored LinearLayout imao je slijedeći XML oblika zapisa. 

<?xml version=“1.0″ encoding=“utf -8″?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”  

android:orientation=“vertical”  

android:layout_width=“fill_parent”  

android:layout_height=“fill_parent”  android:background=“@color/BijelaBoja” >

<TextView

android:layout_width=“fill_parent”  

android:layout_height=“wrap_content”  

android:text=“@string/hello”  

 />

<EditText android:text=“@+id/EditText01″ android:id=“@+id/EditText01″ 

android:layout_height=“wrap_content”  android:layout_width=“fill_parent” ></EditText>

<Button android:id=“@+id/Button01″ android:layout_height=“wrap_content”  

android:layout_width=“wrap_content”  android:text=“Prihvati”  

android:onClick=“myClickButton1″ android:scrollHorizontally=“false” >

</Button>

<Button android:id=“@+id/Button02″ android:layout_width=“wrap_content”  

android:layout_height=“wrap_content”  android:text=“Odbaci”  android:onClick=“myClickButton2″>

</Button>

</LinearLayout>

Raspored kontrola AbsoluteLayout: Sve kontrole se preklapaju

 jer još nisu upisane njihove apsolutne koordinate. 

Ako u prethodnom XML kodu izmijenimo samo nazivrasporeda LinearLayout u AbsoluteLayout, sve kontrole „skupit“će se u gornjem lijevom uglu prikaza, jer bi u ovakvom

Page 21: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 21/91

rasporedu trebalo obavezno navesti apsolutne vrijednosti pozicija kontrola. Budućida to još uvijek nismo napravili, uzete su podrazumijevene vrijednosti 0, što jeizazvalo spomenuto skupljanje kontrola.

Navođenjem apsolutnih vrijednosti za poziciju i veličinu kontrola dolazi do njihovogţeljenog formatiranja, kao što to pokazuje prateća slika uz tekst.

<?xml version=“1.0″ encoding=“utf -8″?>

<AbsoluteLayout xmlns:android=“http://schemas.android.com/apk/res/android”  

android:orientation=“vertical”  

android:layout_width=“fill_parent”  

android:layout_height=“fill_parent”  android:background=“@color/BijelaBoja” >

<TextView

android:layout_width=“fill_parent”  

android:layout_height=“wrap_content”  android:text=“@string/hello”  

 />

<EditText android:text=“@+id/EditText01″ android:id=“@+id/EditText01″ 

android:layout_x=“40px”  

android:layout_y=“50px”  

android:layout_width=“400px”  

android:layout_height=“50px” ></EditText>

<Button android: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>

<Button android: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>

Page 22: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 22/91

</AbsoluteLayout>

Raspored kontrola AbsoluteLayout: Za svaku kontrolu su

navedene apsolutne vrijednosti za određivanje izgleda. 

Zamjenom apsolutnog rasporeda kontrola relativnim u okviru

XML definicije više nije potrebno navoditi apsolutne vrijednostipozicija kontrola, nego samo njihovu relativnu poziciju u odnosu na neku drugu

kontrolu. Apsolutne vrijednosti zaduţene za definiranje veličine kontrole mogu sekoristiti i dalje na isti način. 

Na temelju slijedećeg XML sadrţaja, pomoću relativnog rasporeda kontrolaoponašan je početni raspored kontrola LinearLayout. 

<?xml version=“1.0″ encoding=“utf -8″?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”  

android:orientation=“vertical”  

android:layout_width=“fill_parent”  

android:layout_height=“fill_parent”  android:background=“@color/BijelaBoja” >

<TextViewandroid:layout_width=“fill_parent”  

android:layout_height=“wrap_content”  

android:text=“@string/hello”  

 />

<EditText android:text=“@+id/EditText01″ android:id=“@+id/EditText01″ 

android:layout_alignParentTop=“true”  

android:layout_alignParentLeft=“true”  android:layout_width=“400px”  

android:layout_height=“50px” >

</EditText>

<Button android: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” >

Page 23: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 23/91

</Button>

<Button android: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 korišteno je nekoliko dodatnih elemenata za definiranjerasporeda osnovnih kontrola u okviru osvnovne XML datoteke za

Raspored kontrola RelativeLayout: U ovom slučaju je oponašanosnovni raspored LinearLayout.

definiranje izgleda zaslona. Nešto više riječi o njihovoj namjenimoţete pročitati u slijedećem poglavlju 

Page 24: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 24/91

Android programiranje #6: Korištenje osnovnihAndroid kontrola

Nakon što smo raspravili što su to zapravo rasporedi osnovnih kontrola, udanašnjem nastavku uvoda u Android programiranje moţemo prijeći na drugi bitan

preduvjet izrade korisničkog sučelja, a to je upoznavanje osnovnih kontrolanamijenjenih za postavljenje na takve rasporede. No, prije toga evo jednog primjera

programskog koda (za kojeg nije bilo mjesta u prošlom nastavku), gdje se korisničkosučelje u potpunosti stvara programskim kodom. 

Drugim riječima, ako je programeru iz nekog razloga tako zgodnije, ne mora prvo„crtati“ korisničko sučelje u odgovarajućem prozoru razvojne okoline, a ondadodavati programski kod da „oţivi“ nacrtane kontrole, nego sve to moţe napraviti u

 jednom prolazu isključivo programskim kodom. Ako ste već u prošlosti koristiliMicrosoft Visual Studio, onda će vam sve biti mnogo jasnije kad napišemo da je riječo postupku analognom dinamičkom dodavanju kontrola na formu tijekom izvođenjaprograma.

package Hello.Android;

import android.app.Activity;

import android.os.Bundle;

import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;

import android.widget.TextView;

public class HelloActivity extends Activity

{

private LinearLayout prezimeime;

private LinearLayout adresa;

private LinearLayout podloga;

 /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

createPrezimeIme();

createAdresa();

createPodloga();

Page 25: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 25/91

setContentView(podloga);

}

private void createPodloga()

{

podloga = new LinearLayout(this);podloga.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.FILL_PARENT ));

podloga.setOrientation(LinearLayout.VERTICAL);

podloga.addView(prezimeime);

podloga.addView(adresa);

}

private void createPrezimeIme()

{

prezimeime = new LinearLayout(this);

prezimeime.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.WRAP_CONTENT ));

prezimeime.setOrientation(LinearLayout.HORIZONTAL);

TextView prezimeLbl = new TextView(this);

prezimeLbl.setText(“Prezime ime: “); 

TextView prezime2Lbl = new TextView(this);

prezime2Lbl.setText(“Android Vid”); 

prezimeime.addView(prezimeLbl);

prezimeime.addView(prezime2Lbl);

}

private void createAdresa()

{

adresa = new LinearLayout(this);

adresa.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.WRAP_CONTENT ));

adresa.setOrientation(LinearLayout.VERTICAL);

TextView adresaLbl = new TextView(this);

adresaLbl.setText(“Adresa:”); 

TextView adresa2Lbl = new TextView(this);

adresa2Lbl.setText(“Redacija VIDI”); 

Page 26: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 26/91

adresa.addView(adresaLbl);

adresa.addView(adresa2Lbl);

}

}

Stvaranje rasporeda kontrola i samih kontrola pomoćuprogramskog koda: Ne treba uvijek prvo nacrtati kontrole u

razvojnoj okolini.

Prethodni programski primjer tijekom svojeg izvođenja stvaraosnovni raspored kontrola pod nazivom podloga, a onda na njega dodaje

tekstualne kontrole za prikaz imena i adrese. Sličan postupak se moţe primijeniti za

sve vrste kontrola. Ako ne volite prekucavati primjere, moţete ga pronaći napratećem digitalnom mediju uz časopis. 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 pronaći dosta sličnosti, a ako

niste, onda svakako pogledajte tekst u nastavku te sami pokušajte napraviti nekolikovlastitih primjera s takvim kontrolama. Kontrole ćemo u nastavku prikazati premaučestalosti u aplikacijama – dakle prvo one koje se najčešće koriste. 

TextView 

Kontrola tipa TextView namijenjena je prikazu različitih vrsta tekstova na zaslonu, alibez mogućnosti njihove izmjene odnosno uređivanja. Zato se ova vrsta kontrole uvlastitim aplikacijama najčešće koristi za prikaz informacija korisniku poput dodatnihopisa uz glavne kontrole koje omogućavaju uređivanje teksta. Međutim, ako dio

prikazanog teksta predstavlja web adresa, onda se kontrola moţe upotrijebiti znatnokreativnije, tako da klik mišem na web adresu otvara preglednik te prikazuje njezinsadrţaj (vidi primjer slike uz tekst). Da bi demonstrirali takvo ponašanje kontrole TextView u prethodnom

programskom primjeru treba napraviti dvije izmjene. Prvo, treba u aplikaciju uključitiposebnu klasu za pronalaţenje veze prema veb adresi u tekstualnom nizu znakova(klasa Linkify):

import android.widget.LinearLayout;

import android.widget.TextView;import android.text.util.Linkify;

Page 27: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 27/91

a onda dodati novu kontrolu nazvanu txtWeb čiji tekstualni sadrţaj uključuje webadresu:

private void createPodloga()

{

podloga = new LinearLayout(this);

podloga.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.FILL_PARENT ));

podloga.setOrientation(LinearLayout.VERTICAL);

podloga.addView(prezimeime);

podloga.addView(adresa);

TextView txtWeb = new TextView(this);

txtWeb.setText(“Dodatne informacije o Android programiranju nahttp://www.vidilab.com/”); 

Linkify.addLinks(txtWeb, Linkify. ALL);

podloga.addView(txtWeb);

}

Nakon pokretanja programa, kao što to demonstrira prateća slika uz tekst, usadrţaju kontrole pojavljuje se posebno istaknuta web adresa, a klik na adresu otvara

njezin sadrţaj u podrazumijevanom pregledniku. 

EditText 

Ako je korisniku potrebno omogućiti da u programu upiše odnosno da uredipostojeći tekstualni sadrţaj, onda umjesto kontrole tipa TextView treba

Korištenje kontrole TextView: Omogućava i otvaranje sadrţaja

zadane web adrese.koristiti kontrolu tipa EditText. Treba istaknuti kako ni ova vrsta

kontrole nije zamišljena za upis velikih tekstova, nego prije svegakraćih podataka kakvi se obično zapisuju u pojedine stupce baze

podataka. Kontrola EditText posjeduje brojna dodatna svojstva čijom promjenom

vrijednosti se moţe bitno izmijeniti ponašanje kontrole, prije svega način prikazateksta. Na primjer:

Auto text – automatski ispravlja moguće pogreške tijekom upisa teksta Capitalize – pretvara upisana slova u velika slova

Numeric – postavlja brojčani unos podataka

Password – postavlja upis lozinke (ne vide se znakovi kod upisa)

Page 28: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 28/91

Phone number - postavlja unos telefonskog broja

Single line - definira unos teksta u jednom redu

Slijedeći primjer pokazuje dinamičko dodavanje tekstualne kontrole na osnovni

raspored kontrola uz korištenje dvije dopunske metode za prikaz dodatnih

informacija uz kontrolu.

private void createPodloga()

{

podloga = new LinearLayout(this);

podloga.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.FILL_PARENT ));

podloga.setOrientation(LinearLayout.VERTICAL);

podloga.addView(prezimeime);

podloga.addView(adresa);

 /* dodatak 1 – primjer korištenja kontrole TextView */

TextView txtWeb = new TextView(this);

txtWeb.setText(“Dodatne informacije o Android programiranju na

http://www.vidilab.com/”); 

Linkify.addLinks(txtWeb, Linkify. ALL);podloga.addView(txtWeb);

 /* dodatak 2 – primjer korištenja kontrole EditText */

EditText txtKorisnik = new EditText(this);

txtKorisnik.setText (“Upišite korisničko ime”); 

txtKorisnik.setHint(“Pazite na upis malih i velikih slova”); 

txtKorisnik.setError(“Pazite na veličinu slova”); 

podloga.addView(txtKorisnik);

}

Rezultat klika na web adresu u kontroli TextView: Prikaz sadrţajazadane adrese u pregledniku.

Posebnu vrstu kontrola za upis teksta predstavljaju

kontroleAutoCompleteTextView te MultiAutoCompleteTextVi

ew. Njihova najvaţnija značajka je da tijekom upisa/ispravljanjateksta omogućavaju automatsko dovršavanje upisanog teksta. Evo i primjera

Page 29: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 29/91

odgovarajućeg programskog koda nadopisanog na kraj postojećeg programskogkoda u funkciji createPodloga.

private void createPodloga()

{

podloga = new LinearLayout(this);podloga.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT ,

LayoutParams.FILL_PARENT ));

podloga.setOrientation(LinearLayout.VERTICAL);

podloga.addView(prezimeime);

podloga.addView(adresa);

 /* dodatak 1 – primjer korištenja kontrole TextView */

TextView txtWeb = new TextView(this);txtWeb.setText(“Dodatne informacije o Android programiranju na 

http://www.vidilab.com/”); 

Linkify.addLinks(txtWeb, Linkify. ALL);

podloga.addView(txtWeb);

 /* dodatak 2 – primjer korištenja kontrole EditText */

Primjer korištenja kontrole EditText: Kontrola se koristi za upis iizmjenu teksta.

EditText txtKorisnik = new EditText(this);txtKorisnik.setText (“Upišite korisničko ime”); 

txtKorisnik.setHint(“Pazite na upis malih i velikih slova”); 

txtKorisnik.setError(“Pazite na veličinu slova”); 

podloga.addView(txtKorisnik);

 /* dodatak 3 – primjer korištenja kontrole AutoCompleteTextView */

AutoCompleteTextView actv = new AutoCompleteTextView(this);ArrayAdapter<String> aa = new ArrayAdapter<String>(this,

android.R.layout.simple_dropdown_item_1line,

new String[] {“English”, “Hebrew”, “Hindi”, “Spanish”, “German”, “Greek” }); 

Page 30: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 30/91

actv.setAdapter(aa);

podloga.addView(actv);

}

Nakon upisa početnih slova (npr. en) automatski se predlaţe podudarajuća potpuna

tekstualna vrijednost, pa se ona nakon toga moţe jednostavno izabrati umjesto da se upisuje u cijelosti.

Buttons 

Android platforma omogućava korištenje tri različita tipa gumbi– osnovni gumb (Button Control), gumb sa slikom

(ImageButton Control) te gumb s mogućnošću prikaza dvarazličita stanja gumba (ToggleButton Control). Osnovni tip

gumba već smo koristili u primjerima iz prethodnih nastavaka serijala, a detaljnemogućnosti korištenja sva tri tipa gumbi predstavit ćemo u slijedećem nastavkuserijala zajedno s ostatkom osnovnih kontrola.

Page 31: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 31/91

Android programiranje #7

S predstavljanjem osnovnih Android kontrola prošli put smo zastali na dobropoznatim gumbima (Buttons). Kao i u drugim modernim operativnim sustavima ovaj

tip kontrole koristi se u aplikacijama za izvođenje različitih operacija, a (ponovo kao i

u drugim operativnim sustavima) moţe imati nekoliko pojavnih oblika. Osnovni oblik gumba (Button) na sebi sadrţi samo običan tekst koji označava kakvuće operaciju u okviru određene aplikacije izazvati pritisak na gumb. Ako zadnjihnekoliko desetljeća niste proveli izolirani u samici nekog zaostalog nedemokratskog

reţima bez ikakvog kontakta s modernim računalima, onda je prethodna rečenicasasvim dovoljna da shvatite o čemu je ovdje riječ. Budući da smo ovaj gumb većnekoliko puta koristili u primjerima iz prethodnih nastavaka serijala, kako u pogledu

izmjene osnovnih svojstava, tako i u pogledu dodavanja programskog koda, nećemo

se više ni baviti njime. Budući da se moderna korisnička sučelja sve više temelje na slici nego na riječi,

razumljivo da je običan gumb doţivio svojevrsnu vizualnu nadogradnju, postavšitako u Android terminologiji kontrola pod nazivom ImageButton. Namjena

unaprijeđene kontrole je potpuno jednaka kao i u njezinom osnovnom obliku, jedinošto takav gumb moţe izgledati bitno ljepše (što izravno ovisi o slici postavljenoj na

njegovu površinu). Upravo je zamjena osnovnih vrsta gumbi slikovnim jedan odnajvaţnijih, ali ujedno i najjednostavnijih načina da vlastitu aplikaciju učinite

atraktivnijom te u konačnici privlačnijom potencijalnim korisnicima. Slikovna verzijagumba povezuje se s odgovarajućom datotekom s grafičkim sadrţajem pomoćusvojstva src, što se moţe napraviti u za to namijenjenom prozoru razvojne okoline,izravno u XML datoteci, ili programskim kodom. U priloţenoj segmentu XMLdatoteke prikazan je prim jer korištenja drugog od nabrojenih načina, dok se za istunamjenu u programskom kodu treba koristiti metoda setImageResource().

Treća vrsta gumba pod nazivom ToggleButton omogućava prikaz više stanja iste

pojave unutar aplikacije. Na primjer, jednim stanjem gumba moţe se pokazati da jeuključen nekakav parametar odnosno izvođenje nekakve operacije, a drugim stanjemda je parametar isključen odnosno da je prekinuto izvođenje operacije. U praksi setakva vrsta gumbi najčešće koristi za prilagođavanje različitih dijelova aplikacijeţeljama i potrebama korisnika aplikacije. Kao što to ponovo prikazuje priloţena XMLdatoteka sa definicijama sve tri vrste opisanih gumbi, pomoću dva dodatna svojstvagumba android:textOn=”Pokrenuto” android:textOff=”Zaustavljeno”> moguće jedefinirati dva različita tekstualna sadrţaja za prikazivanje na samom gumbu ovisno o

njegovom trenutnom stanju (uključeno / isključeno). 

Page 32: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 32/91

<?xml version=”1.0″ encoding=”utf -8″?> 

<LinearLayout xmlns: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”  />

<Button android:id=”@+id/Button01″ android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:text=”Tekst gumb”></Button> 

<ImageButton android:id=”@+id/ImageButton01″android:layout_width=”wrap_content” android:layout_height=”wrap_content”android:src=”@drawable/icon”></ImageButton> 

<ToggleButton android:text=”@+id/ToggleButton01″android:id=”@+id/ToggleButton01″ android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:textOn=”Pokrenuto”android:textOff=”Zaustavljeno”>< /ToggleButton>

<RadioButton android:id=”@+id/RadioButton01″android:layout_width=”wrap_content” android:layout_height=”wrap_content”android:text=”Opcija1″ android:checked=”true”></RadioButton> 

<RadioButton android:id=”@+id/RadioButton02″android:layout_width=”wrap_content” android:layout_height=”wrap_content”android:text=”Opcija2″ android:checked=”false”></RadioButton> 

</LinearLayout>

Kako izgleda korisničko sučelje nastalo na temelju prethodne XML datoteke moţete

vidjeti na priloţenoj slici uz današnji tekst. 

Zadnjoj od prije opisanih kontrola prilično slične su još dvije vrste kontrola. Tosu CheckBox i RadioButton. Riječ je o kontrolama koje su zapravo i poznatijekorisnicima aplikacija, jer su osim na Android platformi prisutne u praktično svimmodernim grafičkim sučeljima današnjice. Obje od navedenih kontrola omogućavajuuključivanje/isključivanje različitih opcija, ali se međusobno razlikuju u situacijamakad u korisničkom sučelju aplikacije postoji više kontrola istog tipa. CheckBox

kontrole su u pogledu međusobnog stanja neovisne jedne od druge, što znači dauključivanje ili isključivanje jedne od kontrola ne utječe na stanje druge kontrole.Osim promjene trenutnog stanja od strane krajnjeg korisnika aplikacije, vrijednosti se

Page 33: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 33/91

mogu postavljati programskim kodom korištenjem metode setChecked() dok setrenutno stanje moţe dobiti pomoću isChecked(). Trenutno stanje neke RadioButton kontrole ovisi o stanju drugih kontrola iste vrste,

što drugim riječima znači da u jednom trenutku samo jedna od takvih kontrola moţebiti uključena, dok sve druge kontrole automatski poprimaju vrijednost isključeno.Zato se ova vrsta kontrola koristi za rad s vrijednosti koje se međusobno isključuju.Sa stanovišta programskog koda uključivanje/isključivanje stanja kontrole provodi se

na sličan način kao i kod CheckBox kontrola. Spomenimo na ovom mjestu i to da sepojam međusobnog isključivanja RadioButton kontrola odnosi na kontrole u istom„spremniku“ kontrola. Ako u aplikaciji trebaju postojati dvije neovisne grupe takvih

kontrola, onda treba pripremiti i dva spremnika (npr. rasporeda kontrola).

Evo kratkog segmenta XML datoteke namijenjenog definiranju obiju vrsta kontrola.

CheckBox kontrole:

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent” android:layout_height=”fill_parent”>: Building User Interfaces and Using Controls 

<CheckBox android:text=”Juha” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> 

<CheckBox android:text=”GlavnoJelo” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> 

<CheckBox android:text=”Desert” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /></LinearLayout>

RadioButton kontrole:

Korištenje gumbi: Programeru su na raspolaganju tri različitevrste gumbi.

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent” CHAPTER 4: Building User Interfaces and Using Controls 137 

android:layout_height=”fill_parent”> 

<RadioGroup android:id=”@+id/rBtnGrp” android:layout_width=”wrap_content” 

android:layout_height=”wrap_content” android:orientation=”vertical” > 

<RadioButton android:id=”@+id/pRBtn” android:text=”Piletina” 

Page 34: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 34/91

android:layout_width=”wrap_content” android:layout_height=”wrap_content”/> 

<RadioButton android:id=”@+id/sRBtn” android:text=”Svinjetina” android:layout_width=”wrap_content” android:layout_height=”wrap_content”/> 

<RadioButton android:id=”@+id/gRBtn” android:text=“Govedina” android:layout_width=”wrap_content” android:layout_height=”wrap_content”/> 

</RadioGroup>

</LinearLayout>

U izmišljenoj aplikaciji za naručivanje u restoranu u prvom slučaju korisnik aplikacijemoţe označiti različite dijelove obroka neovisno jedan o drugome, a u drugom

slučaju za glavni obrok moţe izabrati samo jednu od vrsta glavnog jela (mesa). 

Page 35: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 35/91

Android programiranje #8: Android kontrole u

akciji IV

Vrlo vaţan dio gotovo svake aplikacije (osim onih krajnje trivijalnih, ili onih koje supotpuno optimizirane za neko specijalizirano područje) je upravljanje vremenom.

Čak i različite igre, kao kategorija aplikacija kakve se vrlo često pišu za mobilneuređaje uključujući i Android platformu, često spremaju različite podatke o igraču ilistatusu igre povezane s datumom i vremenom. Naravno, za prikaz ili izmjenu

datuma i vremena programer uvijek moţe izmisliti svoje vlastite kontrole, ali nije lošekad je i osnovni razvojni sustav opremljen odgovarajućim kontrolama. To posebnovrijedi kod aplikacija s naglaskom na funkcionalnosti, a ne na vizualnoj raskoši. Android platforma opremljena je s dvije međusobno prilično različite vrste kontrolaza tu namjenu. Prva grupa kontrola moţe samo prikazati podatke o vremenu, dok ih

druga vrsta moţe prikazati, ali i dozvoliti  izmjenu vrijednosti od strane krajnjegkorisnika aplikacije. U prvu grupu kontrola pripadaju

kontroleAnalogClock  i DigitalClock (sam naziv u potpunosti govori o čemu je riječ).Glavni nedostatak im je određen već prije spomenutom namjenom (prikazompodataka), pa se u praksi koriste nešto rjeđe, osim ako je dovoljno da kontrola zaistasamo prikazuje datum ili vrijeme. Zato se s navedene dvije kontrole više nećemobaviti. Ako njihova ograničenja zadovoljavaju vaše planove u izradi aplikacija, jednostavno ih postavite na neki od standardnih rasporeda kontrola i zaboravite na

njih.

U slučaju da je potrebno omogućiti nekakav oblik interakcijekorisnika aplikacije u pogledu odabira datuma i/ili vremena,

onda je bolje upotrijebiti kontrole pod

nazivom DatePicker i TimePicker. Njihovo postavljanje na

osnovni raspored kontrola moţe se napraviti prema slijedećemprimjeru.

<?xml version=“1.0″ encoding=“utf -8″?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”  

android:orientation=“vertical”  

android:layout_width=“fill_parent”  

android:layout_height=“fill_parent” >

<DatePicker android:id=“@+id/datePicker”  

android:layout_width=“wrap_content”  android:layout_height=“wrap_content”  />

<TimePicker android:id=“@+id/timePicker”  

android:layout_width=“wrap_content”  android:layout_height=“wrap_content”  />

</LinearLayout>

Page 36: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 36/91

  Prva (gornja) kontrola zaduţena je za prikaz, odnosno odabir datuma, a donja to

isto radi s vremenom, kao što se to moţe provjeriti na priloţenoj slici uz tekst. Kad setome pridoda programski kod naveden u nastavku zaduţen za podešavanjepočetnih vrijednosti kontrola, dobije se sasvim funkcionalno korisničko sučelje.Najveći nedostatak ove grupe kontrola je njihova relativna nezgrapnost. Drugimriječima jednostavno su prevelike za intenzivno korištenje, naročito ako koristiteuređaj s relativno skromnom rezolucijom zaslona. Ako to predstavlja nepremostivuprepreku moţete se snaći i sami te napraviti vlastite i bitno manje kontrole. 

package Hello.Android;

import android.app.Activity;

import android.os.Bundle;

import android.widget.DatePicker;

import android.widget.TimePicker;

public class HelloActivity extends Activity { /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);DatePicker dp = (DatePicker)this.findViewById(R.id.datePicker );

dp.init(2010, 11, 13, null);

TimePicker tp = (TimePicker)this.findViewById(R.id.timePicker );

tp.setIs24HourView(true);

tp.setCurrentHour(new Integer(10));

tp.setCurrentMinute(new Integer(10));

}

}

Korištenje izbornika 

Osim sasvim jednostavnih uradaka većina aplikacija podrţava neki oblik sustavaizbornika namijenjen izboru svih operacija koje nudi aplikacija. Ni Android platforma

po tome nije nikakav izuzetak. Zapravo mogli bi reći da vrijedi čak suprotno – 

programeru je na raspolaganju nekoliko različitih sustava izbornika, a na njemu je

odluči koji od njih najviše odgovara potrebama konkretne aplikacije. Dok ste neke

od dostupnih sustava izbornika već susretali na drugim operativnim sustavima u vrlosličnom obliku, Android nudi i neke novosti na ovom području, zbog čega ćemo seizbornicima pozabaviti u dva broja časopisa. 

Page 37: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 37/91

  Po običaju krećemo od najjednostavnijeg oblika izbornika, za čiju pojavu u aplikaciji je zaduţen isključivo programski kod nalik na onaj pridodan na kraj prethodnogprojekta za prikaz datumski i vremenski orijentiranih kontrola

(funkcija onCreateOptionsMenu). Navedeni naziv funkcije je obavezan i ujedno

povezan s odgovarajućom aktivnosti u programu. package Hello.Android;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.widget.DatePicker;

import android.widget.TimePicker;

public class HelloActivity extends Activity {

 /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

DatePicker dp = (DatePicker)this.findViewById(R.id.datePicker );

dp.init(2010, 11, 13, null);

TimePicker tp = (TimePicker)this.findViewById(R.id.timePicker );tp.setIs24HourView(true);

tp.setCurrentHour(new Integer(10));

tp.setCurrentMinute(new Integer(10));

}

public boolean onCreateOptionsMenu(Menu menu)

{

super.onCreateOptionsMenu(menu);menu.add(0 // Group

,1 // item id

,0 //order

,”append”); // title 

menu.add(0,2,1,”edit”); 

menu.add(0,3,2,”clear”); 

return true;

Page 38: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 38/91

}

}

Rezultat izvođenja dodatnog programskog koda su tri opcije izbornika, koje sepojavljuju na samom dnu zaslona). Kao što to pokazuje prethodni primjer dodavanjesvake od opcija izbornika zahtijeva navođenje č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 brojčane, a četvrta je iz sasvimrazumljivih razloga tekstualna. Zadnja od nabrojenih opcija moţe se u programskomkodu za generiranje izbornika zadati izravno, kao što je to slučaj u prethodnomprimjeru, ili se odgovarajuća vrijednost moţe unaprijed pripremiti u resursnojdatoteci. Istaknimo kako nije uvijek potrebno navoditi baš sve brojčane vrijednosti,nego se umjesto njih moţe upotrijebiti vrijednost Menu.None.

Ako je potrebno opcije izbornika u aplikaciji grupirati u više od jedne grupe, onda seto rješava navođenjem različitih oznaka grupe prilikom zadavanja naredbi zastvaranje opcija izbornika. Takva podjela izbornika na dvije grupe prikazana je u

slijedećem segmentu programskog koda, kojeg treba umetnuti u program umjestoistoimene funkcije iz prethodnog kompletnog primjera koda. Kako će izgledatidobijeni rezultat moţe se vidjeti na priloţenoj slici uz tekst. 

public boolean onCreateOptionsMenu(Menu menu)

{

 //Group1

int group1 = 1;

menu.add(group1,1,1,”g1.item1″); 

menu.add(group1,2,2,”g1.item2″); 

 //Group2

int group2 = 2;menu.add(group2,3,3,”g2.item1″); 

menu.add(group2,4,4,”g2.item2″); 

return true;

}

Kao što smo to već objasnili ranije, prethodne naredbe izazivaju samo prikazizbornika na zaslonu uređaja, ali pritisak na te izbornike trenutno ne izaziva baš

nikakvu reakciju, jer jednostavno nedostaje odgovarajućeg programskog koda za tu

namjenu. To je tema kojom ćemo se pozabaviti u slijedećem broju, baš kao i

Page 39: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 39/91

dodavanjem slika na opcije izbornika, kako bi se postigao što bolji vizualni dojam uvlastitoj aplikaciji.

U ostatku današnjeg teksta navest ćemo karakteristike preostalih vrsta izbornika

dostupnih na Android platformi. Prva vrsta su takozvani prošireni izbornici. Ova

vrsta izbornika nastaje automatski, ako programer „pretjera“ s brojem opcija

osnovnog izbornika. U tom slučaju se kao opcija izbornika automatski prikazujevrijednost More, a njezinim odabirom korisnik aplikacije moţe stići do početnoskrivenih opcija izbornika. Jedno od ograničenja proširenih izbornika je u tome štone dozvoljavaju prikaz slike, pa zato prilikom pripreme izbornika treba paziti da se na

istom m jestu u aplikaciji ne pojave i trešnje i višnje, to jest opcije izbornika sa slikamai one bez slika.

Kod dodavanja ikona na opcije izbornika u igri je još nekoliko dodatnih ograničenjaosim onog spomenutog u prethodnom odjeljku. Na opciji izbornika s ikonom ne

moţe biti prikazana oznaka njezinog izbora (kvačica), a ako je tekst opcije izbornikanešto duţi, onda će biti prikazan samo početni dio. To i nije nelogično – ako

odaberete ikonu koja vrlo reprezentativno označava neku operaciju, zašto bi je onda

naširoko i opisivali. Prednosti takvog pristupa kod stvaranja višejezičnog sučelja netrebamo posebno ni isticati.

U slučaju vrlo širokog raspona mogućih operacija u aplikaciji,neke (ili sve) opcije izbornika mogu imati svoje podizbornike.

Opcije podizbornika dodaju se programski odgovarajućimmetodama što ćemo prikazati u slijedećem nastavku. Za sadaistaknimo kako i ova kategorija izbornika ne podrţava prikazikona, iako se formalno ne javljaju nikakve greška kod takvog

pokušaja. Izbornici ovisni o kontekstu predstavljaju posebnu vrstu izbornika čiji izgled se

mijenja ovisno o smislu izvođenja pojedinog dijela aplikacije, a aktiviraju setakozvanim dugim pritiskom na neki element korisničkog sučelja. Programer moţe uvlastitu aplikaciju dodati i standardne sistemske izbornike. Kako se to radi, takođerćemo demonstrirati slijedeći put. 

Page 40: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 40/91

Android programiranje #9: Korištenje datotečnogsustava

Nakon što smo u prošlom nastavku pokazali kako se stvara osnovna vrstaizbornika, danas ćemo objasniti kako program na najednostavniji mogući način

putem izbornika odgovara na akcije korisnika. Ujedno ćemo od ovomjesečnognastavka napraviti malo „ubrzanje“ u izlaganju kako bi u planiranom broju preostalihnastavaka mogli doista i napraviti nekakvu malo sloţeniju aplikaciju. Ideja je da

izloţenu materiju prikaţemo na međusobno povezani način, kako nakon prolaskakroz čitav serijal ne bi imali niz nepovezanih segmenata znanja o pojedinimdijelovima Android SDK sustava, ali bez mogućnosti njihovog slaganja u smislenu

cjelinu. S druge strane, na temelju dosadašnjih nastavaka više ne bi trebali imatipreviše problema s tim da pronađete gdje se umeću pojedini dijelovi programskog

koda. Zato na ovom mjestu nećemo izloţiti sve moguće načine stvaranja izbornika i„hvatanja“ operacija korisnika, jer ih ima zbilja podosta, pa bi se izlaganje htjeli mi toili ne, lako pretvorilo u „prepisivanje“ originalnih uputa. Umjesto toga ćemo usloţenijoj aplikaciji koju smo maloprije najavili pokazati brojne dodatne mogućnosti

u korištenju. Osnovni oblik reakcije izbornika na djelovanje korisnika priprema se u dva koraka

prema slijedećem obrascu. U prvom koraku trebaImplementirati OnMenuClickListener sučelje. U drugom koraku, koji se izvodinakon izbora neke od opcija od strane korisnika, poziva se

metoda onMenuItemClick(). To je ujedno mjesto gdje se izvodi stvarna obrada

događaja – pritiska na neku od opcija izbornika.

 //korak1

public class MyResponse implements OnMenuClickListener

{

 //… 

@override

boolean onMenuItemClick(MenuItem item) 

{

 //izvođenje operacije 

return true;

}

}

Page 41: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 41/91

 //korak 2

MyResponse myResponse = new MyResponse(…); 

menuItem.setOnMenuItemClickListener(myResponse);

… 

Osim osnovnog načina reakcije izbornika na događaje postoji još nekoliko varijantikoje ćemo demonstrirati na sloţenijoj aplikaciji. U njoj ćemo ujedno pokazati kako seizvornici mogu stvoriti preko odgovarajuće resursne XML datoteke, a ne samoprogramskim kodom.

Rad s datotekama 

Svaka malo sloţenija aplikacija, koja rukuje s korisnim podacima, mora imati

mogućnost spremanja podataka iz aplikacije u neko spremište te njihovo vraćanje

kad se za tim ukaţe potreba. U današnjem nastavku pokazat ćemo kako se navedenedvije operacije izvode pomoću datotečnog sustava ugrađenog u Android SDK. Za toćemo koristiti dva specijalizirana tijeka podataka – FileOutputStream iFileInputStream. Prvi se koristi za prijenos podataka na relaciji

program – datoteka, a drugi u obrnutom smjeru. Ujedno ćemo pokazati dvijedodatne nuţne operacije kod takvog postupka. Prva je „skupljanje“ trenutnihvrijednosti različitih Android kontrola upisanih od strane korisnika aplikacije kako bise imalo što upisati u datoteku, a druga je njihovo ponovno vraćanje iz datoteke i

postavljanje na odgovarajuću kontrolu. Pogledajmo prvo kako se izvodi spremanje podataka u datoteku na segmentu

programskog koda „izvađenog“ iz jedne manje medicinski orijentirane aplikacije. Uovom trenutku zapravo i nije previše bitno o kakvim se podacima radi. Primijetimosamo da se podaci ne skupljaju isključivo iz tekstualnih nego i iz drugih oblikakontrola, a prije samog spremanja u datoteku se grupiraju u jedan sloţeniji nizznakova. U njemu su podaci međusobno odvojeni posebnim nizom znakova zaodvajanje, kako bi se olakšalo njihovo obnavljanje kod suprotne operacije čitanja iz

datoteke.

Spremanje podataka iz aplikacije: Prethodni primjeri koda odnose

se na jednostavnu medicinski orijentiranu aplikaciju.

Page 42: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 42/91

private void SpremiPodatkeCritical2() throws IOException

{

String FILENAME = “PrvaPomocCritical2″; 

String string = “”; 

FileOutputStream fos;

try

{

final EditText tmp = (EditText) findViewById(R.id.txtSpol);

String tmps = tmp.getText().toString();

if (tmps.length() == 0) tmps = “!!!”; 

final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);

String tmps2 = tmp2.getText().toString();

if (tmps2.length() == 0) tmps2 = “!!!”; 

final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);

String tmps3 = tmp3.getText().toString();

if (tmps3.length() == 0) tmps3 = “!!!”; 

final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);

String tmps4 = tmp4.getText().toString();

if (tmps4.length() == 0) tmps4 = “!!!”; 

final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);

String tmps5 = “N”; 

if (tmp5.isChecked()) tmps5 = “D”; 

final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);

String tmps6 = “N”; 

if (tmp6.isChecked()) tmps6 = “D”; 

final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);

String tmps7 = “N”; 

Page 43: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 43/91

if (tmp7.isChecked()) tmps7 = “D”; 

final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);

String tmps8 = tmp8.getText().toString();

if (tmps8.length() == 0) tmps8 = “!!!”; 

final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);

String tmps9 = tmp9.getText().toString();

if (tmps9.length() == 0) tmps9 = “!!!”; 

final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);

String tmps10 = tmp10.getText().toString();

if (tmps10.length() == 0) tmps10 = “!!!”; 

final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);

String tmps11 = 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 (FileNotFoundException e) {

e.printStackTrace();

}

}

Page 44: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 44/91

  Istaknimo vrlo vaţnu činjenicu koju svakako treba uzeti u obzir kod rada sdatotečnim sustavom, a to je mogućnost pojave greške. Osnovni niz naredbi za zapispodataka u datoteku:

fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);

fos.write(string.getBytes());

fos.close();

moţe ponekad dovesti do pojave greške, ako ni zbog čega drugog onda zbog

nedostatka prostora na mediju na kojem se nalazi datotečni sustav. Kako seaplikacija u tom slučaju ne bi počela nekontrolirano ponašati, treba ugraditi barosnovni mehanizam obrade pogreške u vlastitom kodu, što je ovdje i napravljenokorišten jem standardne try .. catch strukture.

Pogledajmo sada kako se koristi suprotni tijek podataka namijenjen čitanjuspremljenih podataka.

private void VratiPodatkeCritical2() throws IOException

{

String FILENAME = “PrvaPomocCritical2″; 

String string1 = “”; 

setContentView(R.layout.critical2);

FileInputStream fis;

try

{

fis = openFileInput(FILENAME);

BufferedReader buf = new BufferedReader(new InputStreamReader(fis));

string1 = buf.readLine();

String[] list = TextUtils.split(string1, “###”); 

final EditText tmp = (EditText) findViewById(R.id.txtSpol);

if (list[0].matches(“!!!”)) list[0] = “”; 

tmp.setText(list[0]);

final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);

if (list[1].matches(“!!!”)) list[1] = “”; 

Page 45: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 45/91

tmp2.setText(list[1]);

final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);

if (list[2].matches(“!!!”)) list[2] = “”; 

tmp3.setText(list[2]);

final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);

if (list[3].matches(“!!!”)) list[3] = “”; 

tmp4.setText(list[3]);

final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);

tmp5.setChecked(false);

if (list[4].matches(“D”)) tmp5.setChecked(true); 

final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);

tmp6.setChecked(false);

if (list[5].matches(“D”)) tmp6.setChecked(true);

final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);

tmp7.setChecked(false);

if (list[6].matches(“D”)) tmp7.setChecked(true); 

final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);

if (list[7].matches(“!!!”)) list[7] = “”; 

tmp8.setText(list[7]);

final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);

if (list[8].matches(“!!!”)) list[8] = “”; 

tmp9.setText(list[8]);

final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);

if (list[9].matches(“!!!”)) list[9] = “”; 

tmp10.setText(list[9]);

final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);

if (list[10].matches(“!!!”)) list[10] = “”; 

Page 46: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 46/91

tmp11.setText(list[10]);

fis.close();

}

catch (FileNotFoundException e)

{

final EditText tmp = (EditText) findViewById(R.id.txtSpol);

tmp.setText(“$_”); 

final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);

tmp2.setText(“___”); 

final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);

tmp3.setText(“__”); 

final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);

tmp4.setText(“_”); 

final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);

tmp5.setChecked(false);

final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);

tmp6.setChecked(false);

final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);

tmp7.setChecked(true);

final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);

tmp8.setText(“$Alergija”); 

final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);

tmp9.setText(“$Dijagnoza”); 

final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);

tmp10.setText(“$Terapija”); 

final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);

tmp11.setText(“$Napomena”); 

Page 47: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 47/91

e.printStackTrace();

}

}

Ponovno, potrebna je standardna procedura za obradu pogrešaka (throws

IOException), jer se moţe dogoditi da u datotečnom sustavu iz ovog ili onograzloga ne postoji, ili je oštećena datoteka s podacima. Budući da smo prilikomspremanja podatke formatirali tako da se čitava operacija njihovog spremanja izvodi

u jednom koraku (što nije obavezno te ovisi o karakteristikama vlastite aplikacije),sada ćemo čitanje također „odraditi“ u jednom koraku, te ujedno razbiti podatke uodgovarajuće polje podataka pomoću naredbe: String[] list = TextUtils.split(string1, “###”); 

Preostalo je još samo to da se na korištenom rasporedu kontrola unutar aplikacijepronađe odgovarajuća kontrola te da joj se dodijeli točno određena vrijednostpročitana iz datoteke. Za taj postupak koristi se niz findViewById naredbi.

Page 48: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 48/91

Android programiranje #10: Nekoliko standardnih

dijelova aplikacije

Prošli put smo iz nešto sloţenije medicinski orijentirane Android aplikacije „izvukli“dio programskog koda zaduţen za spremanje podataka te za njihovo ponovno

čitanje kad se za tim ukaţe potreba. U današnjem nastavku pokazat ćemo jošnekoliko karakterističnih dijelova programskog koda, koje uz manje ili većepromjene moţete upotrijebiti u vlastitim projektima. 

Prvo jedan sasvim logičan, ali vaţan savjet. Svaka sloţenija Android aplikacija, a

naročito ako ona koristi različite sistemske module (kao što je to slučaj u ovomprimjeru), zahtijeva uključivanje odgovarajućih biblioteka. Ovisno o načinuoblikovanja korisničkog sučelja i pisanju programskog koda, taj je postupak u

najvećoj mogućoj mjeri automatiziran. Međutim, ako se tijekom razvoja u aplikacijiodjednom pojavi čitav niz pogrešaka, postoji dosta velika vjerojatnost da nedostaje(zbog izostanka ili slučajnog brisanja) odgovarajuća import naredba. U nastavku

slijedi prikaz kako to prilično komplicirano izgleda u ovom slučaju: 

Primjer rasporeda kontrola: Jedan od

standardnih dijelova aplikacije za prikupljanje

podataka o korisniku.

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.sql.Date;

import java.text.DateFormat;

Page 49: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 49/91

import java.util.Calendar;

import android.R.bool;

import android.R.integer;

import android.R.string;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.PendingIntent;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.res.ColorStateList;

import android.location.Location;

import android.location.LocationManager;

import android.os.Bundle;

import android.os.Message;

import android.os.Messenger;

import android.telephony.SmsManager;

import android.text.TextUtils;

import android.view.View;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.widget.Button;

import android.widget.CheckBox;

import android.widget.CheckedTextView;

import android.widget.EditText;

U medicinski orijentiranoj aplikaciji čije dijelove koristimo za demonstracijuprogramskog koda, zbog relativno velike količine prikupljenih podataka o korisnikuaplikacije neprikladne za prikaz na samo jednom zaslonu ograničene rezolucije

Page 50: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 50/91

(uobičajene kod mobilnih telefona opremljenih Android sustavom), koristi se višemeđusobno povezanih rasporeda kontrola, a na svakom od rasporeda upotrijebljenesu različite kontrole kako bi se što jednostavnije i preglednije unijeli relevantnipodaci. Kako to zaista izgleda na zaslonu Android uređaja moţete provjeriti natemelju priloţenih slika uz tekst, a dijelovi odgovarajućeg XML koda navedeni su unastavku.

… 

<AbsoluteLayout android:id=”@+id/AbsoluteLayout01″android:layout_width=”fill_parent” android:layout_height=”fill_parent”xmlns:android=”http://schemas.android.com/apk/res/android”> 

<Button android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:layout_x=”0px”

android:layout_y=”0px” android:id=”@+id/btn2VratiSe”android:onClick=”btn2VratiSeClick” android:text=”&lt;&lt;  Natrag”></Button> 

<Button android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:layout_y=”0px” android:text=”Poništinezgodu” android:minWidth=”150px” android:layout_x=”90px”android:onClick=”btn2PonistiNezgoduClick”android:id=”@+id/btn2PonistiNezgodu”></Button> 

… 

<TextView android:layout_height=”wrap_content”android:layout_width=”wrap_content” 

android:text=”Prezime i ime:” android:id=”@+id/txtvPrezimeIme”android:layout_y=”50px” android:layout_x=”2px”></TextView> 

<EditText android:saveEnabled=”false” android:layout_height=”wrap_content”

android:layout_width=”fill_parent” android:layout_x=”0px” android:id=”@+id/txtPrezimeIme” android:singleLine=”true”android:layout_y=”65px”></EditText> 

… 

<AbsoluteLayout android:id=”@+id/AbsoluteLayout01″android:layout_width=”fill_parent” android:layout_height=”fill_parent”xmlns:android=”http://schemas.android.com/apk/res/android”> 

<EditText android:saveEnabled=”false” android:layout_height=”wrap_content”android:layout_width=”wrap_content” android:singleLine=”true”android:layout_y=”65px” android:id=”@+id/txtKrvnaGrupa” android:maxLength=”2″

Page 51: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 51/91

android:text=”__” android:layout_x=”170px” android:maxWidth=”50px”android:minWidth=”50px”> 

… 

<CheckBox android:layout_height=”wrap_content”android:layout_width=”wrap_content” android:id=”@+id/chkSida”android:layout_x=”0px” android:text=”Sida”android:layout_y=”120px”></CheckBox> 

<CheckBox android:layout_height=”wrap_content”android:layout_width=”wrap_content” android:layout_x=”85px”android:layout_y=”120px” android:text=”Hepatitis C”android:id=”@+id/chkHepatitisC”></CheckBox> 

<CheckBox android:layout_height=”wrap_content”android:layout_width=”wrap_content” android:id=”@+id/chkDonator”android:text=”Donator” android:layout_x=”210px”android:layout_y=”120px”></CheckBox> 

U trenutku prelaska s jednog rasporeda kontrola na drugi postojeći sadrţajkontrola iz starog rasporeda kontrola sprema se za kasnije korištenje, a noviraspored kontrola se popunjava prethodno spremljenim sadrţajem (ako takavpostoji zbog ranijeg korištenja aplikacije). Obje operacije objašnjene su u

prethodnom nastavku serijala. Pokaţimo sada kako se programskim kodom prelazi s jednog rasporeda kontrola na drugi. Na svakom osnovnom rasporedu postoje dva

gumba za kretanje na slijedeću odnosno prethodnu stranicu (razumljivo osim naprvom i zadnjem). Slijedi primjer korištenja na drugom rasporedu kontrola – na

njemu postoji gumb za prelazak na prvi, odnosno na treći raspored kontrola. 

public void btn3VratiSeClick(View view)

{

try {

SpremiPodatkeCritical2();

} catch (IOException e1) {

e1.printStackTrace();

}

setContentView(R.layout.critical);

try {

Page 52: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 52/91

VratiPodatkeCritical();

} catch (IOException e) {

e.printStackTrace();

}

}

public void btn3DaljeClick(View view)

{

try {

SpremiPodatkeCritical2();

} catch (IOException e1) {

e1.printStackTrace();

}

setContentView(R.layout.critical3);

try {

VratiPodatkeCritical3();

} catch (IOException e) {

e.printStackTrace();

}

}

Kako eventualne pogreške prilikom kretanja kroz osnovne rasporede kontrola ne bi

izazvale rušenje programa, prijenos prikaza s jednog rasproeda kontrola na drugi„zamotan“ je u odgovarajuću strukturu za obradu pogreške. 

Osim prikaza podataka na standardnim rasporedima kontrola, vrlo često je uprogramu potrebno prikazati i odgovarajuće dijaloške okvire o statusniminformacijama, greškama u radu i slično. U nastavku je naveden primjerprogramskog koda za prikaz dijaloškog okvira s podacima o autorima programa(ako za to ne namjeravate koristiti poseban raspored kontrola zbog veće vizualne

dojmljivosti takvog dijela aplikacije).

Page 53: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 53/91

 Primjer rasporeda kontrola: Drugi standardni dio aplikacije.

public void btnPrvaPomocClick(View view)

{

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

CharSequence poruka = “Autor programa \ n” ; 

poruka = poruka + “Crnko Nenad \n\ n”; 

poruka = poruka + “Stručni medicinski suradnik \ n”; 

poruka = poruka + “Fusić Snjeţana \n\ n”; 

poruka = poruka + “Verzija programa \ n”;poruka = poruka + “25.06.2010 23:00:00″; 

ad.setTitle(“O programu…”); 

ad.setMessage(poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener() 

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

}

Page 54: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 54/91

  U slučaju da vam to negdje zatreba, evo i opće funkcije za otvaranje osnovnogoblika dijaloškog okvira koju uz veće ili manje preinake moţete upotrijebiti uvlastitim aplikacija. Ulazni parametri funkcije su poruka koja se prikazuje u okviru

dijaloškog okvira te njegovo zaglavlje.

private void MsgBox(String Poruka, String VrstaPoruke)

{

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

ad.setTitle(VrstaPoruke);

ad.setMessage(Poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener() 

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});ad.show();

}

Navedimo na kraju današnjeg nastavka najsloţeniji „komad“ programskog kodazaduţen za pripremu i slanje SMS poruke s podacima iz programa u slučajunezgode. Zbog ograničenja prostora u časopisu ovim dijelom ćemo se neštodetaljnije pozabaviti u slijedećem nastavku serijala. 

public void btnPosaljiSMSClick(View view)

{

final Button btnPosaljiSMS = (Button) findViewById(R.id.btnPosaljiSMS);

Calendar Kalendar = Calendar.getInstance ();

CharSequence mTrenutnoVrijeme = Kalendar.getTime().toString();

mGodina = Kalendar.get(Calendar.YEAR);

mMjesec = Kalendar.get(Calendar.MONTH);

Page 55: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 55/91

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 (IOException e1) {

e1.printStackTrace();

}

final CheckBox tp = (CheckBox) findViewById(R.id.chkGPSPozicija);

String pozicija = “”; 

if (tp.isChecked())

{

try

{

LocationManager locationManager;

String context = Context.LOCATION_SERVICE;

locationManager = (LocationManager)getSystemService(context);

String provider = LocationManager.GPS_PROVIDER;

Location location = locationManager.getLastKnownLocation(provider);

Page 56: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 56/91

double lat = location.getLatitude();

double lng = location.getLongitude();

pozicija = ” ” + Double.toString(lat) + ” / ” + Double.toString(lat); 

}

catch (Exception e)

{

e.printStackTrace();

}

}

try

{

final EditText tmp = (EditText) findViewById(R.id.txtSMSPoruka);

String tmps = tmp.getText().toString();

if (tmps.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran tekst SMS poruke!”, “Upozorenje”); 

return;

}

final EditText tmpbr = (EditText) findViewById(R.id.txtSMSBroj);

String tmpsbr = tmpbr.getText().toString();

if (tmpsbr.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran broj za slanje SMS poruke!”, “Upozorenje”); 

return;

}

Page 57: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 57/91

setContentView(R.layout.main);

VratiPodatkeMain();

tmps = tmps + pozicija;

SmsManager sm = SmsManager.getDefault();

sm.sendTextMessage(tmpsbr, null, tmps + pozicija, null, null);

}

catch (Exception e)

{

MsgBox(e.getMessage(),”Greška”); 

e.printStackTrace();

}

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

CharSequence poruka = “Zabiljeţeno vrijeme slanja SMS poruke za pomoć \n\ n” ; 

poruka = poruka + mTrenutnoVrijeme.toString();

ad.setTitle(“Potvrda operacije”); ad.setMessage(poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

btnPosaljiSMS.setText(“SMS poruka: ” + mTrenutnoVrijeme); 

try {

SpremiPodatkeMain();

Page 58: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 58/91

} catch (IOException e) {

e.printStackTrace();

}

}

Page 59: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 59/91

Android programiranje #11: Standardni dijelovi

aplikacije

Na kraju teksta u prethodnom broju časopisa naveden je malo veći segmentprogramskog koda za izvođenje nekoliko bitnih stvari u programu, ali jednostavnonije bilo dovoljno mjesta za njegovo detaljnije objašnjenje. Zato u današnjemnastavku slijedi malo detaljnija rasprava o korištenim objektima i metodama u tom

dijelu aplikacije.

Razjasnimo prvo namjenu izdvojenog dijela programskog koda s kraja prethodnog

nastavka, kako bi lakše mogli pratiti detalje u nastavku. Ideja je da korisnik aplikacije

u trenutku kad doţivi nekakvu nezgodu (koja bitno utječe na njegovo zdravstvenostanje) moţe što jednostavnije i brţe poslati SMS poruku na unaprijed definirani broj,

kako bi izabranu osobu ili ustanovu obavijestio o svojoj nezgodi. Pretpostavka zaizvođenje takvog postupka je da nakon nezgode ostane u svjesnom stanju, kako bi

zaista mogao pokrenuti aplikaciju te pritisnuti gumb za slanje SMS poruke. Ako

moţe napraviti tu operaciju, onda moţe pritisnuti i drugi gumb kako bi zabiljeţiovrijeme nezgode, jer se tako kod pruţanja prve pomoći lako moţe ustanoviti koliko je vremena doista prošlo od nezgode. To moţe biti vrlo bitan faktor za poduzimanjerazličitih operacija nad unesrećenim. Čak i ako korisnik aplikacije u trenutku kad

stigne prva pomoć bude u nesvijesti, moţe se pročitati podatak o trenutku nezgode,

kao i drugim bitnim karakteristikama unesrećenog (krvna grupa, kronične bolesti islično). Te informacije su dostupne i u situaciji kad SMS poruka nije poslana, a nije

zabiljeţen ni trenutak nezgode – bitno je samo da spasitelji malo „pročeprkaju“ poAndroid mobitelu, jer je on najverojatnije negdje pri ruci. Ostaje još samo odgovorna pitanje zašto su operacije slanja SMS poruke i biljeţenja trenutka nezgode

razdvojene. Postoje situacije kad SMS poruku, a pogotovo neke njezine dijelove (vidi

nastavak teksta) nije moguće ni pripremiti ni poslati, pa se u tom slučaju moţezabiljeţiti samo trenutak nezgode. 

LocationManager: Vrlo sloţen objekt na

Android platformi zaduţen za dobijanje točnegeografske lokacije.

Page 60: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 60/91

  Prvi dio programskog koda je najjednostavniji za objašnjavanje jer sluţi za običnoodređivanje točnog vremena nakon pritiska korisnika na odgovarajući gumbaplikacije. To vrijeme se trajno pamti kako bi ga spasitelji mogli naknadno očitati.Ovaj segment programskog koda „zamotan“ je u standardnu rutinu za obradupogreške, u slučaju da se dogodi nekakav problem tijekom izvođenja aplikacije. 

public void btnPosaljiSMSClick(View view)

{

final Button btnPosaljiSMS = (Button) findViewById(R.id.btnPosaljiSMS);

Calendar Kalendar = Calendar.getInstance ();

CharSequence mTrenutnoVrijeme = 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 (IOException e1) {

e1.printStackTrace();

}

Page 61: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 61/91

final CheckBox tp = (CheckBox) findViewById(R.id.chkGPSPozicija);

Da bi SMS poruka koja se šalje na unaprijed definirani telefonski broj bila štokorisnija, ideja je da njezin dio bude točna geografska lokacija s koje je porukaposlana, kako bi se što brţe i jednostavnije došlo do unesrećenog korisnikaaplikacije. Ako mobilni telefon (ili neki drugi uređaj koji se temelji na Android

platformi) u sebi sadrţi odgovarajući hardverski dio za dobijanje takvog podatka,onda slijedeći dio programskog koda koristi Android objekt LocationManager za

dobijanje potrebnog geolokacijskog podatka.

String pozicija = “”; 

if (tp.isChecked())

{

try{

LocationManager locationManager;

String context = Context.LOCATION_SERVICE;

locationManager = (LocationManager)getSystemService(context);

String provider = LocationManager.GPS_PROVIDER;

Location location = locationManager.getLastKnownLocation(provider);

double lat = location.getLatitude();

double lng = location.getLongitude();

pozicija = ” ” + Double.toString(lat) + ” / ” + Double.toString(lat); 

}

catch (Exception e)

{

e.printStackTrace();

}

}

Prethodne naredbe sadrţe još nekoliko naredbi za formatiranje podataka ogeografskoj lokaciji, kako bi podaci u okviru poruke bili prikazani na što čitljiviji

podaci razumljiv spasiteljima. Kao i obično, bitno je da takv dio aplikacije podloţanpogreškama bude obuhvaćen u strukturu za obradu pogrešaka. Zahtijevani podatak

Page 62: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 62/91

moţe u nekom trenutku jednostavno biti nedostupan.  Na primjer, izvor GPS

podataka je uništen solarnom bakljom. Dobro – malo se šalimo, mnogo je vjerojatnijineki drugi uzrok problema, iako prema najavama nekih stručnjaka 2012 godine tomoţda uopće više neće biti samo šala. 

LocationManager je vrlo sloţen objekt na Android platformi pa njegovo detaljno

opisivanje prelazi okvire ovog teksta. Osnovni primjer prikazan u prethodnom dijeluprogramskog koda, trebao bi vam posluţiti kao vodič za dodatno istraţivanjepratećih uputa o Android SDK sustavu. 

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 slučaju da navedena dva podatka nisupripremljena, onda se korisniku aplikacije javlja odgovarajuća poruka kako bi seriješio problem. Za to se koristi funkcija o čijoj smo namjeni i djelovanju raspravljali u jednom od prethodnih nastavaka serijala.

Sasvim je jasno da kritična situacija, u kojoj se moţe naći korisnik aplikacije, nije bašidealan trenutak da aplikacija javi kako smo u fazi njezinog punjenja početnimpodacima zaboravili navesti neki detalj (fiksni dio SMS poruke ili odredišni broj).Otprilike se radi o istoj situaciji kao kad bi vaš najnoviji automobil (dostupan uzmjesečnu ratu od svega 500 kn, ali uz učešće od 30 posto i ostatak vrijednosti od 30posto – kako to danas nude sitnim slovima neki oglasi na koje se skoro navukao i

autor ovih redova), u trenutku hitnog kočenja javio nekakvu poruku da to ne moţe iline ţeli napraviti. Rješenje problema je vrlo jednostavno. Nakon upisivanja svihpotrebnih podataka u aplikaciju na samom početku njezina korištenja, treba poslatiprobnu poruku te provjeriti je li zaista sve u redu.

try

{

final EditText tmp = (EditText) findViewById(R.id.txtSMSPoruka);String tmps = tmp.getText().toString();

if (tmps.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran tekst SMS poruke!”, “Upozorenje”); 

return;

}

Page 63: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 63/91

final EditText tmpbr = (EditText) findViewById(R.id.txtSMSBroj);

String tmpsbr = tmpbr.getText().toString();

if (tmpsbr.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran broj za slanje SMS poruke!”, “Upozorenje”); 

return;

}

setContentView(R.layout.main);

VratiPodatkeMain();

tmps = tmps + pozicija;

SmsManager sm = SmsManager.getDefault();

sm.sendTextMessage(tmpsbr, null, tmps + pozicija, null, null);

}

catch (Exception e)

{

MsgBox(e.getMessage(),”Greška”); 

e.printStackTrace();

}

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

CharSequence poruka = “Zabiljeţeno vrijeme slanja SMS poruke za pomoć \n\ n” ; 

poruka = poruka + mTrenutnoVrijeme.toString();

ad.setTitle(“Potvrda operacije”); 

ad.setMessage(poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener() 

{

@Override

Page 64: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 64/91

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

Na kraju cijelog postupka prikazuje se točno vrijeme slanja poruke. Ne trebaposebno ni napominjati da se svi podaci iz prethodne operacije spremaju u

odgovarajuća „spremišta“ u mobilnom telefonu, kako bi i kasnije bili dostupni prema

potrebi.

btnPosaljiSMS.setText(“SMS poruka: ” + mTrenutnoVrijeme); 

try {

SpremiPodatkeMain();

} catch (IOException e) {

e.printStackTrace();

}

}Na temelju svega dosad napisanog u ovom te u prethodnih nekoliko brojeva, već

bi trebali biti u mogućnosti sami izrađivati relativno sloţene Android aplikacije.Međutim, još uvijek nismo završili serijal, jer nam je preostala demonstracijakorištenja nekoliko bitnih tehnika kao što je dobro poznati Google Maps,preuzimanje podataka s ugrađenih senzora, korištenje dodatnih grafičkih i zvučnihmogućnosti te još poneka zanimljivih sitnica. Ostalo je još dosta zanimljivogmaterijala za slijedećih nekoliko nastavaka, posebno ako sve te dijelove uz dodatak

već obrađenih ţelimo kreativno povezati u prave aplikacije.

LocationManager: Vrlo sloţen objekt naAndroid platformi zaduţen za dobijanje točne

geografske lokacije.

Page 65: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 65/91

Android programiranje #12: Alternativni pristup

razvoju aplikacija

U prethodnih desetak (i još malo više) nastavaka serijala o Android programiranjupokazali smo dosta toga što vam moţe pomoći kod razvoja vlastitih aplikacija – 

počevši od instalacije svih potrebnih alata na vlastito računalo pa sve do razvojastandardnih dijelova sloţenijih aplikacija. U međuvremenu se uređaji bazirani naAndroidu (telefoni, ali i „tabletići“ te drugi mobilni uređaji) sve bolje prodaju širomsvijeta, tako da razvoj aplikacija za ovu platformu sigurno neće biti uzaludan napor. 

Iako ćemo se u slijedećih nekoliko nastavaka serijala pozabaviti s još nekolikonaprednijih programerskih tehnika, ovaj put ćemo se malo detaljnije osvrnuti naalernativni (čitaj bitno jednostavniji) način za razvoj aplikacija, također nastao u

radionicama istog proizvođača. Na kraju krajeva među čitateljima časopisa sigurnoima onih s vrlo dobrim idejama za razvoj novih aplikacija, ali im se korištenje GoogleSDK alata ipak čini malo prekompliciranim. Srećom, Googleovi inţenjeri intenzivnorade na nešto drugačijem pristupu čitavoj stvari, pa ćemo vas u današnjem nastavkuupoznati s njihovim najnovim uradkom za tu namjenu.

App Inventor for Android je naziv za alat namijenjen malo manje spretnim

programerima dizajniranim tako da omogućava vizualno orijentirani razvoj različitihAndroid aplikacija izravno u pregledniku. Zbog toga je pisanje programskog koda

gotovo u potpunosti izbačeno iz alata te zamijenjeno nečim genijalno preglednim.Ako ste ipak zainteresirani za programiranje, onda vam ovaj alat zapravo i ne treba,

 jer već imate dobro poznati Android SDK.

Iako u trenutku pisanja teksta (prema tvrdnjama iz samog Googlea) alat još uvijekne podrţava sve što je zamišljeno (još uvijek se nalazi u beta fazi razvoja) već sada sepomoću njega mogu napraviti zanimljive i korisne aplikacije. Googleovi inţenjerinaglašavaju kako se trenutni problemi prije svega odnose na područja instalacijeupravljačkih uređaja, prijenosa dijelova razvojnog alata Java na računalo te

distribuciju same aplikacije na odredišni mobilni uređaj, odnosno postavljanjerazličitih postavki korištenja aplikacije na tom uređaju. Zato se u trenutnoj fazirazvoja alata od zainteresiranih korisnika traţi da pripreme što detaljnije povratneinformacije o korištenju alata, kako bi se što prije prevladali svi uočeni problemi. 

Priprema računala za razvoj: Mogu se koristiti različitekombinacije operativnih sustava i preglednika.

Page 66: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 66/91

 

Razvoj vlastitih aplikacija u alatu App Inventor for Android započinje pripremomvlastitog računala za takav zadatak. Za razliku od Microsofta ili Applea poznatih po

ograničavaju razvoja na vlastiti hardver i/ili softver, Googleov razvojni timkontinuirano podrţava sve najpopularnije platforme (Windows, Mac i Linux). Zato

nije ni čudo da se Android polako, ali sigurno, probija prema samom vrhupopularnosti na području mobilnih platformi. Nastavak teksta, te prije svega pratećeslike) podrazumijevaju razvoj vlastitih aplikacija u Google Chrome pregledniku na

Windows računalu, ali iz prije navedenih razloga ne bi trebali imati previše problemani u razvoju aplikacija na nekoj drugoj konfiguraciji.

Prvi korak u pripremi računala je preuzimanje odgovarajućeg programa zaupravljanje pripremom razvojne konfiguracije. Ovaj program moţe se slobodnopreuzeti usmjeravanjem preglednika na web

adresuhttp://appinventor.googlelabs.com/learn/setup/setupwindows.html 

Nakon preuzimanja instalacijskog programa treba ga instalirati na računalo tepodesiti parametre ciljnog mobilnog uređaja. U trenutnoj fazi razvoja alata podrţano je izravno svega nekoliko uređaja poput T-Mobile G1 ili T-Mobile myTouch, dok se

za ostalo „očvrsje“ treba pomučiti malo više te napraviti manja ili veća podešavanjana samom telefonu. Budući da je ovaj postupak ovisan o samom telefonu, kao takav

prelazi okvire napisanog teksta. Sve potrebne informacije moţete pronaći slijedeći

odgovarajuće linkove na prije navedenoj web adresi. 

Početak rada na aplikaciji: Započinje stvaranjem projekta – u

ovom slučaju HelloPurr. 

Izrada prve aplikacije 

U nastavku teksta opisat ćemo izradu prve aplikacije prema Googlevoj pratećojdokumentaciji. Za razliku od uobičajenog Hello World primjera koji samo prikazujedvije riječi na zaslonu, Googleov početni primjer odmah koristi i audio/videopodatke, to jest prikazuje sliku te reproducira zvuk. Zato kao početni korak u izradiaplikacije treba skinuti jednu sliku u .pngformatu, odnosno jednu zvučnu datotekuu .mp3 formatu. Umjesto onih koje nudi Google za testiranje razvojnog alata,

moţete upotrijebiti svoje vlastite, ali za sada ćemo se drţati priloţene „kuharice“. 

Razvojni alat pokrećete postavljanjem preglednika naadresuhttp://appinventor.googlelabs.com. Da bi se moglo prijeći na razvoj same 

aplikacije potrebno je da korisnik ima odgovarajući google email korisnički račun.

Page 67: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 67/91

Ako ga još nemate, ovo je prilika da ga stvorite. Kad obavite tu formalnost, pojavljujese stranica namijenjena pripremi novih aplikacija, odnosno administriranju

postojećih. Budući da pripremate svoj prvi projekt, izaberite opciju New na vrhu

stranice te upišite naziv aplikacije HelloPur.

Razvojna okolina: Vrlo je jednostavna i namijenjena korisnicima

koji nisu profesionalni programeri.

Kao rezultat izvođenja prethodne operacije pojavljuje se glavna stranica razvojnog

alata namijenjena izradi aplikacije (vidi prateće slike uz tekst). Sve izgleda vrlo jednostavno, ali je sasvim dovoljno za korisnike kojima je namijenjena – 

neprofesionalnim programerima s dobrim idejama za vlastite aplikacije.

U lijevom dijelu stranice nalaze se različite grupe kontrola namijenjeneiskorištavanju brojnih mogućnosti Android sustava. Tijekom razvoja prve aplikacijebit će nam potrebne svega dvije kontrole: Button i Label. Jednostavnom operacijom

povlačenja postavite in na središnji dio stranice namijenjen simuliranju zaslonamobilnog uređaja. Kontrole postavite jednu ispod druge, a onda je preostalo da im

izmijenite nekoliko svojstva, kako bi dobili izgled sučelja prikazan na jedno j od

pratećih slika uz tekst. KontroliButton potrebno je obrisati početni tekst prikazan nakontroli (svojstvoText) te učitati prije spomenutu sliku kitty.png (svojstvo Image).

KontroliLabel potrebno je postaviti boju pozadine na plavu

(svojstvo BackgroundColor), povećati veličinu pisma na 30 (svojstvo FontSize), te

upisati novi tekst „Pet the Kitty“. Svojstvo koje se koristi za zadnju operaciju većznate s prve kontrole. Sve to se izvodi u prozoru Properties na desnoj strani

osnovne stranice.

Postavljanje prve kontrole: Izvodi se običnim povlačenjemkontrole na centralni dio koji predstavlja zaslon mobilnog

uređaja. 

Page 68: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 68/91

  Na ovom stupnju razvoja aplikacije u nju je dodana slika, ali još uvijek ne i zvučnizapis. Zato je potrebno u aplikaciju povući još jednu kontrolu (Sound iz

grupe Media), a onda pomoću gumba na dnu stranice dodati prijespomenutu mp3 datoteku (meow.mp3). Ovim potezom sučelje je u potpunostidovršeno s dizajnerske strane, ali je za kompletiranje aplikacije potrebno napraviti još nešto. Da bi se tijekom izvođenja aplikacije pritiskom na sliku umiljate mačkiceizazvalo njezino glasanje, to jest reprodukcija mpr datoteke, potrebno je ipak

„napisati mali program“. Prethodnu tvrdnju smo stavili u znake navoda, jer je zarazliku od drugih vizualno orijentiranih sučelja, koja u konačnici ipak zahtijevajuprilično znanje programiranja, Google ovdje stvarno napravio korak naprijed. Na vrhu osnovne stranice potrebno je kliknuti na opciju Open the Block Eidtor, a

ako ste to napravili prvi put, pričekati određeno vrijema kako bi se na vaše računaloinstalirala dodatna komponenta za „pisanje programskog koda“. Evo ponovnonavodnika, a konačno i objašnjenja zašto. Kad se otvori popis svih dostupnihdogađaja, oni su prikazati u obliku svojevrsne slagalice. Potrebni događaj ukontekstu nekog dijela aplikacije potrebno je jednostavno „spariti“ s pravomoperacijom, što se izvodi običnom operacijom povlačenja. U konkretnom slučajupotrebno je događaj Button1.Click  povezati s operacijom Sound1.Play i to je to.

Koliko to efektno izgleda moţete provjeriti na priloţenoj slici ili isprobati sami. BravoGoogle!

Prozor Properties: Koristi se za izmjenu različitih svojstavaoznačene kontrole. 

Preostalo je još samo da isprobate aplikaciju na stvarnom hardverskom uređaju

tijekom instalacije povezanim s razvojnim alatom, ili na odgovarajućem softverskomemulatoru. Na kraju je pomoću operacijePackage for Phone moguće napraviti idistribucijski oblik aplikacije.

Priznajte da nije bilo komplicirano, iako nismo baš detaljno opisivali način promjenesvojstava. Ipak bi ovaj tekst trebali pratiti čitatelji s bar početnim poznavanjemprogramiranja, tako da ne bi trebao biti problem izvesti tako elementarne operacije

u dizajnu aplikacije.

Pomoću alata App Inventor for Android (iako je još uvijek u fazi beta verzije) mogu

se napraviti znatno sloţenije aplikacije u što se moţete uvjeriti i sami nakon malovjeţbe. 

Page 69: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 69/91

Android programiranje #13: Alternativni pristup

razvoju aplikacija II

Prošli put smo demonstrirali osnove korištenja Googleovog alternativnog alata zarazvoj Android aplikacija namijenjenog neprogramerima i „malo manje spretnim

programerima“. App Inventor for Android, kako je njegov naziv, pokazao se sasvimprikladnim za stvaranje elementarne Android aplikacije (nešto slično klasičnom HelloWorld primjeru), a danas ćemo probati prikazati da je upotrebljiv za bitno sloţenijeprojekte.

Odgovorimo prvo na nekoliko najvaţnijih pitanja povezanih s korištenjem alata narazvoju sloţenijih projekata. Najvaţnije pitanje koje se nameće samo po sebi jepotencijalna sloţenost dovršene aplikacije. Tu odmah treba biti izravan te reći da sepomoću alata App Inventor for Android ne moţe napraviti baš sve što i s sluţbenim

razvojnim alatom, ali da se moţe puno toga – moţe se. Osim brojnih komponenti zarazvoj različitih dijelova sučelja (što smo djelomice pokazali u u prošlom uvodnomtekstu o alatu), na raspolaganju su najvaţnije programske strukturepoput foreach, while, if-else (iako u nešto slikovitijem obliku nego je to uobičajenou programskim jezicima), a moguća je i komunikacija s web servisima te svojevrsnimspremištem podataka. Od vaţnijih tehnologija karakterističnih za mobilne uređajedanašnjice, trenutno nije podrţan samo Bluetooth, ali se prema tvrdnjamaproizvođača intenzivno radi i na tom segmentu. 

Basic komponente: Predstavljaju osnovne grafičke elementeaplikacije.

Ako vam slučajno ni sve nabrojano nije dovoljno za izradu vlastite aplikacije, ondaalat skoro neograničeno moţete nadopunjavati izradom vlastitih komponenti u Javi.

To znači da morate ipak biti nešto vještiji u programiranju, a onda se neminovnopostavlja pitanje zašto ne bi sve skupa ipak programirali u standardnom SDKrazvojnom sustavu. Ako pomoću alata App Inventor for Android moţete sami

odraditi veći dio projekta, onda ima smisla da za manji nedostajući segment vlastiteaplikacije angaţirate Java programera da vam pomogne. 

Trenutno dva najveća nedostatka alata odnose se na nemogućnost izravne objaveaplikacije na globalnom trţištu Android aplikacija (Android Market), te ograničenostaplikacije na samo jedan prikaz (raspored kontrola). Google obećava kako će prviproblem biti uskoro riješen pa se zato njime nećemo previše baviti. Napišimo zato

Page 70: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 70/91

nekoliko riječi o drugom problemu. Na trenutnom stupnja razvoja alata ne moţe seizvoditi prebacivanje između više različitih vrsta prikaza ili rasporeda kontrola. To naprvi, drugi i treći pogled predstavlja zbilja veliko ograničenje u razvoju aplikacija, aliga je ipak moguće prevazići jednim od slijedeća dva trika. 

1.  Naizmjeničnim „paljenjem i gašenjem“ kontrola, to jest izmjenom vidljivosti

različitih komponenti postavljenih na jedini dostupni prikaz kontrola. 2.

  Međusobnim višestrukim povezivanjem više App Inventor for Androidaplikacija, od kojih svaka moţe imati različite rasporede kontrola na osnovnomzaslonu. Kad su prije koje desetljeće nešto slično mogli raditi autori sloţenihigara na strojevima poput ZX Spectruma ili Commodorea 64 te kasetofonom

kao uređajem vanjske memorije, nema nikakvog razloga zašto se to ne bimoglo napraviti i danas sa znatno modernijim hardverom.

Media komponente: Komponente za upravljanje različitimmultimedijalnim dijelovima mobilnog uređaja. 

Iako slijedeća vijest nema nikakve veze s prethodnom točkom, današn jim tekstom,

pa čak ni cijelim serijalom u cjelini, ipak ću je spomenuti na ovom mjestu, ako je dosada već niste sami negdje pročitali. Kultni Commodore 64 je prije kratkog vremenadoţivio svoju inkarnaciju s istim izgledom izvana, ali ultramodernim hardverom i

softverom iznutra. Narudţbe se mogu napraviti već sada, a isporuka se očekuje upetom mjesecu. Morao sam to jednostavno spomenuti – prve ljubavi se teškozaboravljaju, makar to bila i računala. 

Vratimo se sada ponovo današnjoj temi. Ključne dijelove aplikacije moţemopodijeliti u dvije velike skupine:

1.  Komponente ili kontrole

2.  Blokove

Komponente su osnovni grafički dijelovi aplikacije, a međusobno se osim po izgledurazlikuju prije svega po svojoj namjeni. Osnovna grupa komponenti pod

nazivom Basic obuhvaća zbilja osnovne komponente karakteristične za modernakorisnička sučelja poput gumbi, oznaka i slika. Ako ste ikad probali napisati bilokakvu aplikaciju u nekom modernijem razvojnom alatu, trebali bi znati o čemu je

riječ, pa se zato i nećemo previše baviti njihovim karakteristika. Uistoj grupi kontrola nalaze se još dvije sloţenije kontrole, a oneipak zahtijevaju poneku dodatnu riječ. To su Canvas i TinyDB.

Page 71: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 71/91

Animation komponente: Preduvjet za njihovo korištenje je postojanje komponenteCanvas.

Kontrola Canvas zamišljena je kao dvodimenzionalno područje za crtanje likovapomoću programskog koda, odnosno za pomicanje sličica („sprites“). Budući da je toisto područje osjetljivo na dodir, sasvim je razumljivo da predstavlja temeljni diovećine različitih igara razvijenih u ovom alatu. Svaka od lokacija na komponentiCanvas označava se uobičajenim matematičkim zapisom za dvodimenzionalnepovršine – kao koordinate x i y. O vaţnosti navedene kontrole u razvoju aplikacijanajbolje govori činjenica da je u zadnjoj reviziji alata od strane Googlea s kraja

trećeg mjeseca, veliki dio poboljšanja dodan upravo u Canvas kontrolu. 

Neka od tipičnih svojstava i metoda Canvas kontrole, čija imena govore sama zasebe su:

BackgroundImage, LineWidth, Touched(number x, number y, boolean

touchedSprite), Clear(), DrawLine(number x1, number y1, number x2, number

 y2), DrawCircle(number x, number y, number r). 

Tijekom pisanja igara kontrola Canvas se vrlo često upotrebljava u kombinaciji skontrolom Clock  kako bi se osiguralo odvijanje operacija u zadanim vremenskim

intervalima. Spomenimo na ovom mjestu kako kontrola Clock ujedno pripada grupi„nevidljivih“ kontrola, što znači da se ne vidi tijekom izvođenja aplikacije, ali mora bitinacrtana na osnovnoj formi kako bi se mogle koristiti njezine mogućnosti. Kontrola TinyDB namijenjena je trajnom spremanju podataka iz aplikacije u mobilni

uređaj. Prilikom svakog prekida izvršavanja aplikacije gubi se sadrţaj svih korištenihkontrola te se ponovo puni inicijalnim vrijednostima kod slijedećeg pokretanjaaplikacije. Ako prilikom novog pokretanja aplikacije treba krenuti od njezinog

zadnjeg stanja, onda treba postojati nekakav mehanizam za spremanje vrijednosti iz

aplikacije u Android uređaj, te njihovo ponovno čitanje (na primjer, postavkeaplikacije, stanje bodova u privremeno prekinutoj igri i slično). Upravo za takvunamjenu zamišljena je kontrola TinyDB, odnosno njezine dvije jedine dostupnemetode:

StoreValue(oznaka, vrijednost) 

Sprema vrijednost (niz znakova ili popis) pod određenim nazivom u spremište namobilnom uređaju. 

Page 72: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 72/91

GetValue(oznaka) 

Čita vrijednost sa zadanim nazivom iz spremišta. U slučaju da traţena oznaka nepostoji u spremištu (npr. kod prvog pokušaja čitanja vrijednosti na novom uređaju),onda metoda vraća prazan niz znakova. 

U slučaju da treba obrisati spremište od starih vrijednosti, onda se to izvodi na

telefonu standardnom naredbom Settings → Applications → Manage Applications. 

U grupi kontrola pod nazivom Media nalazi se 5 komponenti slijedećihnaziva: Camera, ImagePicker, Player, Sound i VideoPlayer. Svaka od kontrola

zaduţena je za upravljanje odgovarajućim hardverskim ili softverskim resursom, pasu u skladu s tim i dodijeljeni nazivi svojstava odnosno metoda

(npr.TakePicture ili AfterPicture za kontrolu Camera, odnosno Start, Stop ili Pause

za kontrolu Player).

Grupa kontrola Animation te njezine dvije jedine

komponente Ball odnosno ImageSprite, koriste se u kombinaciji s prije

spomenutom kontrolom Canvas za aplikacije u kojima je potrebno izvoditi različitevrste pokretanja grafičkih objekata (dakle najčešće igre). Na priloţenoj slici uz tekstvidi se da je preduvjet za korištenje kontroli iz ove grupe upravo postojanje kontroleCanvas. Pomoću svojstava kontrola poputInterval, Speed ili Rotates upravlja se

učestalošću, brzinom i rotacijom „sličica ili loptica“ u vlastitoj aplikaciji. Budući da u jednoj aplikaciji moţe biti više Canvas kontrola, nema nikakvog razloga da njihovim

inteligentnim paljenjem i gašenjem na jednom jedinom zaslonu (prije istaknutoograničenje trenutne verzije razvojnog alata) napravite prilično kompleksnu igru. 

Social komponente: Zaduţene su za pristup i korištenje različitihsocijalnih podataka iz mobilnog uređaja. 

Posljednja grupa kontrola koju ćemo spomenuti u današnjem nastavku su kontroleiz grupe Social zaduţene za pristup i korištenje različitih socijalnih podataka izmobilnog uređaja (ContactPicker, EmailPicker, PhoneCall, PhoneNumberPicker,

Texting i Twitter). Pomoću ovih kontrola moguće je postići da vlastite aplikacije

upravljaju telefonskim pozivima, slanjem sms i/ili email porukama, odnosno

korištenjem usluga Twittera (npr. korištenjem metodapoput DirectMessage, RequestDirectMessage iliRequestFriendTimeLine).

U slijedećem nastavku napravit ćemo pregled preostalih dostupnih kontrola, a ondanapraviti nekoliko sloţenijih primjera, koji bi trebali prikazati kako ovim alatomdoista nije problem brzo napraviti i znatno sloţenije aplikacije. 

Page 73: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 73/91

Android programiranje #14: Alternativni pristup

razvoju aplikacija III

Danas ćemo se pozabaviti preostalim komponentama dostupnim u Googleovomalatu App Inventor for Android namijenjenom brzom razvoju Android aplikacija.

Komponente su razvrstane u nekoliko grupa slijedećih naziva: Sensors, ScreenArrangement, LEGO MINDSTORMS, Other stuff i Not ready for prime time.

Krenimo redom.

Sensors komponente: Zaduţene su za upravljanje različitimsenzorima u mobilnom uređaju. 

Sensors komponente

Danas je sasvim uobičajeno da pametni telefoni i drugi uređaji temeljeni naAndroidu imaju ugrađen manji ili veći broj senzora, koji se mogu vrlo djelotvornoiskoristiti u različitim vrstama aplikacija (najčešće igrama). Zbog toga je razvijenonekoliko posebnih komponenti za relativno jednostavnu podršku takvoj vrsti

hardvera. Sve komponente su nevidljive tijekom izvođenja, ali moraju biti uključene uaplikaciju da bi se mogle iskoristiti njihove mogućnosti. 

Komponenta AccelerometerSensor zaduţena je za interakciju softvera sasenzorom za mjerenje pomicanja uređaja po sve tri osi koordinatnog sustava. Od

tuda dolaze nazivi najvaţnijih svojstava: XAccel, YAccel, Zaccel. Pomoću svojstvaAvailable programer moţe provjeriti jesu li navedeni senzor uopće dostupni uuređaju, a svojstvom Enabled upravljati dozvolom korištenja senzora. DogađajemAccelerationChanged moţe se precizno reagirati na pomicanje uređaja po bilo kojoj

od navedene tri osi (parametara događaja), dok je nešto „grublji događaj“ Shakingnamijenjen mnogo jednostavnijem zadatku – običnoj provjeri „drmanja“ uređajem.Drugi događaj se najčešće moţe upotrijebiti za efektan prekid izvođenja različitihoperacija u aktivnoj aplikaciji.

Druga nevidljiva kontrola iz iste skupine je LocationSensor, a namijenjena je

dobijanju geografske pozicije mobilnog uređaja, ako je u njega ugrađenodgovarajući GPS prijemnik (svojstvo HasLongitudeLatitude). Softverski je podrţanomjerenje nadmorske visine (svojstvo HasAltitude), ako i takva mogućnost postoji u

hardveru. Ostalim dostupnim svojstvima moţe se dobiti vrijednost svake odnavedenih tri dimenzija, dok su događaji LocationChanged te StatusChangedzaduţeni za reakciju aplikacije na promjene pozicije uređaja u prostoru, odnosno na

Page 74: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 74/91

promjene načina mjerenja pozicije (izravno dobijeni GPS podaci ili podaci dobijeniod mreţnog operatora). Zadnja komponenta iz grupe OrientationSensor zaduţena je za provjeru

orijentacije uređaja u prostoru (svojstva Roll, Pitch i Yaw te događajOrientationChanged). Ova sofverska komponenta se u kombinaciji s pripadajućimsenzorom koristi u različitim aplikacijama za promjenu načina prikaza podatakaovisno o promjeni orijentacije uređaja (vodoravni ili vertikalni prikaz podataka). Screen Arrangement komponente

Screen Arrangement komponente: Koriste se kao „podloga“ zaraspored drugih kontrola.

Sve tri komponente iz ove grupe (HorizontalArrangement, TableArrangement i

HorizontalArrangement) zaduţene su za jednostavnije raspoređivanje ostalihkomponenti po zaslonu uređaja. Kao što im i nazivi govore, svaka od komponenti jezaduţena za jednu vrstu rasporeda osnovnih kontrola. Osim za početnoraspoređivanje kontrola sve tri komponente mogu se također iskoristiti za njihovo jednostavnije premještanje ili skrivanje. Dostupna svojstva kontrola su vrlo

 jednostavna te razumljiva sama po sebi (Visible, Height, Width, Rows i Columns).

LEGO MINDSTORMS komponente

Sedam komponenti iz grupe LEGO MINDSTORMS predviđene su za upravljanjerazličitih dijelovima poznatog Lego kompleta za učenje robotike pomoću nekog odAndroid uređaja. Iskreno, nismo imali priliku ni zadovoljstvo isprobati kako sve to

skupa djeluje u praksi, pa se zato za sada nećemo previše ni baviti ovim dijelomrazvojnog alata. Nadamo se da ćemo u ne tako dalekoj budućnosti ipak biti u prilici

isprobati simbozu Lego i Google proizvoda.Other stuff  komponente

LEGO MINDSTORMS komponente: Zaduţene su za povezivanje sLego „očvrsjem“. 

Page 75: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 75/91

  Šaroliko društvo softverskih komponenti iz ove grupe nikako se po svojoj namjenine moţe dovesti u izravnu vezu, zbog čega je cijela grupa dobila naziv koji označavatakvu raznolikost.

Jedna od najvaţnijih komponenti iz grupe je komponenta ActivityStater. Zaduţena je za pokretanje nekoliko različitih aktivnosti na uređaju: drugih aplikacija

napravljenih u istom alatu ako takve postoje u uređaju (čime se moţe izbjeći dosta ozbiljno ograničenje o korištenju jednog zaslona ekrana po aplikaciji), aplikacijezaduţene za upravljanje kamerom (ako je kamera ugrađena u mobilni uređaj),pretraţivanje web sadrţaja, postavljanje preglednika na točno određenu web adresu,odnosno postavljenje točno određene lokacije na karti. Zbog toga komponentapodrţava različite načine vlastitog pozivanja. Evo primjera iz prateće dokumentacijezaduţenog za pretraţivanje weba u „potrazi za vampirima“. Action: android.intent.action.WEB_SEARCH

ExtraKey: query

ExtraValue: vampire

ActivityPackage: com.google.android.providers.enhancedgooglesearch

ActivityClass: com.google.android.providers.enhancedgooglesearch.Launcher

Komponenta BarcodeScanner zaduţena je za jednostavno čitanje običnih

 jednodimenzionalnih, ali i sve popularnijih dvodimenzionalnih bar kodova(korištenjem metode DoScan, svojstva Result i događaj AfterScan). Da je takvakomponenta jednostavno neizostavna u modernim softverskim rješenjima, autorteksta moţe posvjedočiti iz prve ruke. Na nedavno završenoj Microsoftovojkonferenciji Windays 11 u Rovinju, osim očekivanih mjesta za takvu vrstuoznačavanja, dvodimenzionalni bar kodovi su se mogli primijetiti i na majicamanekih sudionika. Naoruţani Android uređajem te odgovarajućom aplikacijom više ne

morate gubiti vrijeme da bi saznali osnovne informacije o vlasniku majice. Umjesto

toga u njegovom smjeru jednostavno uperite kameru i pogledate na zaslonu sve štovam ţeli odati o sebi. 

Other stuff komponente: Ostale komponente koje se koriste u

razvoju.

Page 76: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 76/91

  Dvije komponente sličnog naziva BluetoothServer i BluetoothClientzaduţene suza podršku obiju strana koje sudjeluju u Bluetooth komunikaciji  (servera i klijenta).

Popis dostupnih metoda, svojstava i događaja je zbilja impresivan (bar u usporedni s

drugim komponentama iz istog alata), a potrebno je poznavati još poneki detaljBluetooth tehnologije, tako da se u ovom tekstu jednostavno ne moţemo detaljnijepozabaviti njihovim korištenjem. Kako je potpisnik ovih redova u bliskoj prošlostiimao prilike raditi na Bluetooth orijentiranom projektu namijenjenom starim dobrim

Java MIDP uređajima, osobno moţe potvrditi da je korištenje Google tehnologije naistom području bitno jednostavnije. Budući da sami razvojni inţenjeri tvrde da se naovom segmentu razvojnog alata još uvijek intenzivno radi, ipak treba malo sačekatisa završnom ocjenom. Komponenta Notifier omogućava prikaz različitih vrsti obavijesti korisniku

aplikacije odnosno trajno biljeţenje takvih informacija u svrhu kasnije analize. Za to je pripremljeno nekoliko metoda (ShowMessageDialog, ShowChooseDialog,

ShowTextDialog, ShowAlert i LogError) čije korištenje rezultira različitim načinomprikaza informacija korisniku odnosno njihovom biljeţenju. Na raspolaganju sutakođer dva događaja: AfterChoosing i ShowChooseDialog, kako bi se moglo

ustanoviti što je poduzeo korisnik kao reakciju na prikazane informacije od straneaplikacije.

Zadnje dvije komponente iz grupe (SpeechRecognizer i TextToSpeech) zamišljenesu kao podrška za izradu govorno orijentiranog korisničkog sučelja u vlastitimAndroid aplikacijama. Prva kontrola namijenjena je razumijevanju izgovorenog, dok

 je druga zaduţena za suprotan proces – izgovaranje napisanog teksta. Koliko to sve

skupa radi ili ne radi dobro s različitim govornim jezicima moţete isprobati sami.Obje komponente su vrlo jednostavne za korištenje, jer se primjena svodi naupotrebu jednostavnih metoda poput GetText, Speek, Country i Language.

Spomenimo na ovom mjestu kako se za izgovor napisanog teksta koristi ista Google

tehnologija koja je korištena u serijalu o naprednom programiranju Windowsaplikacija, objavljenom u više prethodnih brojeva vašeg omiljenog časopisa. 

Not ready for prime time komponente

Not ready for prime time komponente: Eksperimentalne

komponente u intenzivnoj fazi razvoja.

Page 77: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 77/91

  U posljednoj grupi komponenti navedene su komponente na čijem razvoju jošuvijek intenzivno rade Googleovi razvojni inţenjeri, pa su kao takve podloţnerazličitim promjenama dok ne stignu u fazu dovršenog proizvoda. Trenutno su u tu

grupu svrstane slijedeće komponente: 

FusionTablesControl – korištenje kartografskih prikaza u kombinaciji s FusionTables

tehologijom.GameClient – povezivanje aplikacija (najčešće igara) s odgovarajućim serverima za„udruţene NEzločinačke poduhvate“. SoundRecorder – biljeţenje i pohranjivanje zvučnih zapisa. TinyWebDB – komunikacija s web servisima zbog dvosmjerne razmjene podataka.

Voting – osnova za buduće glasačke listiće u „Android demokraciji budućnosti“. Kako su sve nabrojane komponente iz ove grupe u razvoju, za sada se nećemopreviše ni baviti njima. Ipak moramo priznati da nas strašno zanima vrlo novi svijet u

kojem ćemo praktično trenutno moći odlučivati o bitnim stvarima u zemlji, a nečekati da to radimo od izbora do izbora. Naţalost, ipak bi se mogli okladiti naprilično velike iznose kako će takvu tehnologiju prije prihvatiti različiti „reality“spektakli nego drţavna uprava. Ţivi bili pa vidjeli. 

Ovime je završeno predstavljanje najvaţnijih segmenata Googleovog razvojnogalata za neprogramere. Preostalo je da pomoću njega probamo napraviti jednusloţeniju aplikaciju kao demonstraciju kako različite komponente surađuju u praksi. 

Page 78: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 78/91

Android programiranje #15: Izrada složenijihaplikacija

Nakon što smo u prošlih nekoliko nastavaka predstavili najvaţnije dijeloveGoogleovog alata za razvoj aplikacija namijenjenog korisnicima neprogramerima,

odnosno malo manje vještim programerima, došao je trenutak da pokaţemo kako seti dijelovi zaista koriste u vlastitim aplikacijama. Za razliku od prve demo aplikacije,

kad smo vrlo detaljno riječju i slikom opisivali kako se izvode sve operacije potrebneda se dobije dovršena aplikacija, u današnjem nastavku ćemo samo naznačiti glavnesmjernice u pripremi aplikacije, a na vama je da probate sami dovesti projekt u

funkcionalno stanje. Tako ćemo odmah pripremiti i svojevrsnu vjeţbanju u korištenjualata.

Iako se danas mobilni uređaji koriste za izvođenje više desetaka različitih operacija– od planiranja vlastitog vremena, preko slušanja muzike i gledanja filmova pa svedo igranja različitih vrsta igara, mogućnost izvođenja starog, dobrog telefonskogpoziva (ili bar odgovaranja na njega) još uvijek ostaje jedna od najbitnijih namjenavećine mobilnih telefona. Zato ćemo u prvom primjeru nešto sloţenije aplikacijedemonstrirati što moţemo napraviti u Googlevom razvojnom alatu po tom pitanju,ako ne ţelimo koristiti već ugrađene mogućnosti u sam uređaj. 

Pretpostavka za uspješno izvođenje slijedeće aplikacije na konkretnom Androiduređaju je da taj uređaj podrţava izvođenje telefonskih poziva, a ne samo različiteinternet orijentirane načine vlastitog korištenja (pregled web stranica, razmjena emailporuka i slično). Također, u spremište kontakata u uređaju trebalo bi biti upisano barnekoliko telefonskih brojeva, a nekima od brojeva trebale bi biti dodijeljenje slike

njihovih vlasnika. Čak i ako svi nabrojeni zahtjevi budu zadovoljeni, moţe se dogoditida na nekim uređajima primjer ipak ne djeluje kako se očekuje. Razloge treba traţiti u tome što u trenutnoj fazi razvoja alat App Inventor for Android još uvijek nije nitestiran ni optimiziran za sve dostupne uređaje na trţištu. Googleovi razvojni

inţenjeri obećavaju kako će takve „porođajne muke“ biti riješene u bliskojbudućnosti kad razvojni alat više ne bude u fazi svojevrsnog testiranja. 

Za uspostavu telefonskog poziva iz Android uređaja, kao što to već znate, trebakreirati novi prazan projekt te mu dodijeliti nekakav naziv koji simbolizira namjenu

projekta. U pripremi primjera povezanog s ovim tekstom korišten jenaziv VidiPhoneCall, ali nema apsolutno nikakvog razloga da ne odaberete neki

drugi mnogo „razumljiviji“ naziv (npr. APC 4MM – Android PhoneCall System for

Modern Manager). Od dostupnih Android komponeti u projektu su nam na samompočetku potrebne samo dvije: komponenta PhoneCall iz grupe Social te

komponenta Button iz grupe Basic. U nastavku teksta ćemo slične konstrukcijeskraćeno pisati Social -> PhoneCall, odnosno Basic -> Button.

Page 79: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 79/91

 

Social -> Phone Call: Temeljna komponenta za izvođenjetelefonskog 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 slučaju jednostavnijih projekta takvi nazivi se moguizravno koristiti za dovršetak projekta, ali dobra praksa iskusnijih programerapredlaţe njihovo preimenovanje u daleko razumljivije nazive, kako bi se kasnijeolakšalo snalaţenje u projektu. Što se u nekom projektu koristi više različitihkomponenti (to vrijedi i za sve druge razvojne alate), to je vaţnije imati smislenije

nazive, da bi se programer što brţe i jednostavnije mogao snaći u naknadnoj analizi iizmjeni programskog koda. Dobro, kod alata App Inventor zapravo ni ne moţemogovoriti baš o „pisanju programskog koda“, jer je prije riječ o nećemu nalik slaganjukomada slagalice sastavljene od dostupnih događaja i metoda korištenih komponeti,ali nema nikakvog razloga da ignoriramo pravilo o imenovanju komponenti.

Preimenovanje komponente postavljene na osnovni zaslon projekta izvodi se

njezinim označavanjem, te klikom na gumb <Rename> u razvojnoj okolini alata.  Za

potrebe ovog projekta komponentu PhoneCall1 preimenovali smou TelefonskiPoziv, a komponetu Button1 uUspostaviPoziv. Još jednom ponavljamo– budući da bi rad na ovom projektu trebao ujedno biti vaša samostalna vjeţbakorištenja Googleovog razvojnog alata, nazive komponenti moţete izabrati premavlastitim sklonostima. Za komponentu Telef onskiPoziv moţe se izmijeniti i početnavrijednost svojstva PhoneNumber na ţeljeni broj pozivatelja (ako se pozivi najčešćeupućuju na taj broj), dok komponenti UspostaviPoziv treba izmijeniti svojstvo Text,

kako bi zamjena za podrazumijevanu vrijednost Text for Button1 preciznije

pokazivala namjenu gumba.U ovom trenutku je dovršeno „crtanje“ korisničkog sučelja, a sad preostaje još samoto da se „napiše  odgovarajući programski kod“, odnosno dovrši slagalica uinovativnom Googleovom sučelju za tu namjenu (o čijem korištenju je bilo više riječiu prvom nastavku serijala). Sasvim konkretno – u ovom slučaju potrebno je napravitipovezivanje bloka Click  iz kontrole UpostaviPoziv s blokomMakePhoneCall iz

kontrole TelefonskiPoziv. Na taj način dovršena je prva verzija aplikacije koja

omogućava uspostavu telefonskog poziva iz Android uređaja s upisanim odredišnim

brojem nakon što korisnik pritisne kontrolu (gumb) UspostaviPoziv. Djelovanjeprograma moţete (ili ipak ne moţete) provjeriti sami na vlastitom komadu Android

hardvera, već prema tome kako je on trenutno podrţan od strane Googleovihrazvojnih inţenjera. 

Page 80: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 80/91

  Na trenutnom stupnju razvoja naše nove aplikacije trebalo bi biti mogućeuspostaviti telefonski poziv, ali aplikacija još uvijek „nema pojma“ o podacima

zapisanim u bazu kontakata u okviru samog uređaja, nego se svi telefonski brojevimoraju upisivati u cijelosti. Budite iskreni pa priznajte sami sebi koliko često u praksizaista izvodite operaciju upisivanja broja pozivatelja u odnosu na učestalost biranja

dostupnih brojeva iz baze kontakata. Zato aplikaciju treba dodatno proširiti tako dapostane „svjesna“ ranije pripremljenih telefonskih brojeva. 

Dovršeno sučelje aplikacije za telefoniranje: Omogućavakorištenje podataka iz spremišta kontakata u samom uređaju. 

U drugoj verziji aplikacije ćemo na osnovni zaslon aplikacije dodati još jednu novukontrolu: Social -> PhoneNumberPicker, a onda joj izmijeniti predloţeni nazivu IzaberiBroj, odnosno tekst koji se prikazuje na kontroli s početne vrijednosti Text

for PhoneNumberPicker1 za hrvatsku verziju aplikacije primjereniji oblik Izaberi

broj. Kontrola tipa PhoneNumberPicker predstavlja svojevrsnu verziju običnoggumba, s tom razlikom da pritisak na kontrolu automatski izaziva prikaz podataka iz

postojeće baze kontakata u uređaju. Kad smo napisali „prikaz podataka“, onda smozaista mislili samo na to, jer odabir telefonskog broja iz prikazanih podataka jošuvijek nije moguć, bar ne tako dugo dok se ponovo ne pripremi odgovarajuća„slagalica“ za upravljanje izvođenjem programa. Da bi se na temelju izabranog podatka iz popisa kontakata zaista ostvario

telefonski poziv, potrebno je spojiti blok AfterPicking kontrole IzaberiBroj s

blokom MakePhoneCall iz kontrole TelefonskiPoziv. Potrebno je napraviti jošprijenos odgovarajućeg parametra (izabranog telefonskog broja) između te dvije

kontrole, što se izvodi dodatnim vezanjem blokaPhoneNumber kontrole IzaberiBrojs prije navedenim blokom MakePhoneCall. Ovim korakom, ako je sve pravilno

izvedeno, trebala bi biti dovršena druga faza u razvoju aplikacije. Sada je aplikacijaspremna za izvođenje telefonskih poziva na temelju prije spremljenih podataka ubazu kontakata.

U smislu poboljšanja grafičkog izgleda aplikacije moguće je u aplikaciju dodati jošponeki detalj. Premda se u trenutnoj verziji broj iz baze kontakata zaista moţeizabrati kao temelj za telefonski poziv, korisnik aplikacije još uvijek ne moţe vidjeti o

kojem je telefonskom broju riječ. Da ne spominjemo nemogućnost prikaza slikevlasnika telefonskog broja, ako takva postoji u uređaju. Unapređenje korisničkogsučelja aplikacije moţe se postići tako da se u okviru istog

Page 81: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 81/91

bloka AfterPicking kontrole IzaberiBroj, naprave dva dodatna povezivanja.

Blok PhoneNumber iz kontrole IzaberiBroj treba povezati s blokom Text ranije

opisanog gumba UspostaviPoziv, a blok Picture iz kontrole IzaberiBroj spojiti s

blokom Image, također svojstvom gumba UspostaviPoziv. Navedenim operacijama je aplikacija poboljšana u vizualnom smislu pa osim zahtijevane funkcionalnosti sada

posjeduje i odgovarajuće korisničko sučelje. Trenutna verzija aplikacija se i dalje moţe nadograđivati, pa evo nekoliko ideja koje

moţete probati napraviti sami: 

1. 

Osim prijenosa broja koji se poziva iz baze spremljenih kontakata, probajte

prenijeti još neke podatke na osnovni zaslon aplikacije (prije svega prezime iime korisnika). Razmislite prvo trebaju li vam kakve dodatne kontrole na sučelju,da bi to zaista mogli napraviti. Ova točka ne bi trebala biti prezahtijevna zarealizaciju.

2. 

Podaci o uspostavljenim pozivima mogli bi se sačuvati za kasniju analizu. Kako je u ovom slučaju riječ o malo zahtijevnijem postupku, o njemu će više riječi bitineki drugi put.

Na kraju, ambiciozniji čitatelji mogu probati sami napraviti sličan projekt ispočetkatako da se umjesto uspostave telefonskog poziva izvodi slanje dobre, stare SMS

poruke. U tom slučaju temeljnu kontrolu za rad aplikacije (Social -> PhoneCall),

treba zamijeniti nečim drugim, ali vam to sada nećemo otkriti, nego vam ostavljamoda na temelju prethodnih nastavaka serijala i vlastitog eksperimentiranja sami

pronađe o čemu je riječ. U svakom slučaju preporučamo vam da sami probate„odraditi“ cijeli posao oko današnje aplikacije, kako bi mogli lakše pratiti slijedećiprojekt, gdje ćemo još manje detaljizirati oko biranja kontrola i njihovog korištenjanego što je to bi slučaj danas. Budući da ćemo raditi na mnogo sloţenijem projektu jednostavno moramo pretpostaviti da su vam dobro poznate osnovne stvari oko

korištenja Googleovog alata za neprogramere.

Page 82: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 82/91

Android programiranje #16: Korištenjekartografskih servisa

U današnjem završnom nastavku svojevrsnog podserijala o korištenju Googleovogalata za brzo prototipiranje aplikacija, pokazat ćemo kako se u okviru tog alatakoriste kartografske mogućnosti Googleovih servisa, jedne od najčešće korištenihtehnologija u aplikacijama na mobilnim uređajima.Dodatna vrlo zanimljiva razvojnatehnika demonstrirana u istom primjeru je pozivanje jedne Android aplikacije iz

druge Android aplikacije. Već smo nekoliko puta spomenuli kako je trenutno jednood najvećih ograničenja Googleovog razvojnog alata za neprogramere u tome što seunutar jedne aplikacije moţe koristiti samo jedan raspored kontrola. Upravosposobnošću pozivanja jedne aplikacije iz druge moţe se zaobići spomenutoograničenje. Način korištenja kartografskih servisa na kojem se temelji današnji tekstprikazan je u Googeovom primjeru pripremljenom od strane profesora DavidaWolbera sa sveučilišta u San Franciscu. Prije nego što nastavimo s detaljnijim objašnjavanjem primjera istaknimo na ovom

mjestu još jednu bitnu mogućnost operativnog sustava Android u pogledu izraderješenja koje se sastoji od većeg broja sastavnih dijelova. Dok za pozivanje drugogdijela aplikacije iz početnog dijela treba koristiti komponentu ActivityStarter,

povratak unatrag se izvodi potpuno automatski. Dovoljno je samo izabrati

standardnu operaciju operativnog sustava za tu namjenu, to jest odgovarajuću tipku

na samom uređaju. 

Prvi dio aplikacije (sučelje): Sastoji se od tri osnovne kontrole:Image1, ListPicker1 i ActivityStater1.

U prvom dijelu aplikacije na osnovni zaslon projekta postavljene su svega tri

kontrole: Image1, ListPicker1 i ActivityStater1. Kontrole su redom

namijenjene za prikaz početne slike programa, izbor triju različitih odredišta zaprikaz na karti, te na kraju komponente za pokretanje dodatne kartografski

orijetirane aplikacije. Prve dvije kontrole ne bi trebale biti posebno teške zakorištenje, tako da ih nećemo ni posebno opisivati. Uostalom, kontrolu za prikaz

slika koristili smo već u prvom, najtrivijalnijem primjeru korištenja alata. Nešto više vremena posvetit ćemo korištenju komponente ActivityStarter, zato štoona zahtijeva oblik znanja kakav je uobičajen u krugovima pravih Android

Page 83: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 83/91

programera, ali nije baš uobičajen za korisnike neprogramere. Drugim riječima,druga komponenta cjelokupnog rješenja mora se pozvati iz prve prema točnomdefiniranom protokolu, što bi u ovom slučaju imalo otprilike slijedeći oblik:

ActivityStarter svojstvo Vrijednost

Action android.intent.action.VIEW

ActivityClass com.google.android.maps.MapsActivity

ActivityPackage com.google.android.apps.maps

Prvi dio aplikacije (programski blokovi): Najvaţniji dio povezan jeaktivnostima kontrole ActivityStarter.

Programski blokovi povezani s aplikacijom podijeljeni su u dva dijela. Prvi dio je

zajedno s pratećim deklaracijama vrijednostima zaduţen za pripremu početnogizgleda aplikacije (vidi prateću sliku uz tekst), dok se drugi izvodi nakon odabira neke

od zadanih lokacija: “Tour Eiffel”, „Musee du Louvre“ i „Cathedrale Notre Dame“.Nakon odabira jednog od navedena tri mjesta iz popisa prelazi se na izvođenjeprogramskog blokaListPicker1.AfterPicking.

Na ovom mjestu dolazimo do male dodatne komplikacija pa je treba objasnitinešto detaljnije. Da bi se pomoću komponente ActivityStarter mogla uspješnopokrenuti druga komponenta za prikaz nekog mjesta na mapi, potrebno je

komponenti prenijeti adresu u točno propisanom formatu, a to u ovom slučaju značipopunjavanje svojstvaActivityStater.DataUri. U spomenuto svojstvo mora se

postaviti kombinacija vrijednosti „geo:0,0?q=“ te konkretne vrijednosti za izabranu

lokaciju iz popisa dostupnih mjesta (ListPicker1.Selection). Za to se koristi posebni

programski blok zaduţen za rukovanje nizovima znakova (make text). U slučaju

odabira druge od dostupnih vrijednosti dobije se konačnavrijednost: geo:0,0?q=’Musee du Louvre’.

Izvođenje aplikacije: Osnovni oblik izvođenja aplikacije u Android

emulatoru.

Page 84: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 84/91

  Sad je konačno sve spremno za pozivanje drugog dijela aplikacije, pa prvi dioaplikacije zaista predaje kontrolu izvođenja drugom dijelu na ranije opisani način. Poţelji se (to smo isto već spomenuli) moţete vratiti na prvi dio korištenjem standardneoperacije u operativnom sustavu Android.

„Sirovi“ oblik kartografskog prikaza kakav je u ovom trenutku prisutan u aplikaciji

moţe se dalje nadograđivati tako da se modulu zaduţenom za prikaz objektamnogo preciznije zada način prikaza nekog mjesta prema sintaksi propisanoj od

strane Googlea. Na primjer, za znatno atraktivniji način prikaza svih triju lokacijamogla bi se navesti „malo sloţenije odrednice“: 

Eiffel Tower

http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=eiffel+towe

r&sll=37.0625,-95.677068

&sspn=48.909425,72.333984&ie=UTF8&hq=Tour+Eiffel&hnear=Tour+Eiffel,+Quai+

Branly,+75007+Paris,+Ile-de-

France,+France&ll=48.857942,2.294748&spn=0.001249,0.002207&t=h&z=19

Musee Louvre

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

Notre Dame, Street View

ttp://maps.google.com/maps?f=q&source=s_q&hl=en&q=french+landmarks&sll=4

8.853252,2.349111&sspn=0.002411,0.004415

&ie=UTF8&t=h&radius=0.12&split=1&filter=0&rq=1&ev=zi&hq=french+landmark

s&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

U slučaju da ţelite provjeriti sami kako sve to skupa lijepo djeluje u praksi, a nemazeni vremena ni volje da ispočetka razvijate cijelu aplikaciju, moţete krenuti linijommanjeg otpora te usmjeriti svoj preglednik na

adresu http://appinventor.googlelabs.com/learn/tutorials/maptour/maptour.html 

Page 85: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 85/91

Kontinuirani razvoj alata

Napredno izvođenje aplikacije: U prikaz su uključene dodatneopcije za prikaz slika na zadanoj lokaciji.

U razdoblju od prvog spominjanja razvojnog alata App Inventor for Android u

ovom serijalu, pa do današnjeg nastavka, Googleovi razvojni inţenjeri marljivo suradili na njegovim unapređenjima (a rade i dalje). Budući da se razvoj aplikacija

izvodi izravno u nekom od preglednika nije potrebno preuzimati nikakve nove

verzije alata da bi se iskoristile te novosti, nego su one odmah dostupne čim se alatslijedeći put pokrene nakon njegovog aţuriranja na Googleovom serveru. 

Osim ispravke uočenih pogrešaka prijavljenih od strane korisnika, izgleda da senajintenzivnije radi na daljnjim doradama komponenti u okviru kolekcije Other

Stuff . Komponenta Web zamišljena je tako da osigurava dodatne mogućnosti uizravnom preuzimanju podataka s web servera, za što se do sada morao koristitiposeban Java kod (ili programski kod u nekom drugom programskom jeziku)

distribuiran na server. Sada je postalo moguće pozivati određene skupine API

funkcija izravno preko Web komponente. Na primjer, korištenjem poziva funkcija iz

Yahoo Finance API biblioteke prilično je jednostavno u Android aplikaciju dodatiprikaz različitih poslovnih informacija o čijoj pripremi i pouzdanosti brine Yahoo. Iako to nema izravne veze s temom današnjeg teksta, za eventualno zainteresirane

ipak spomenimo kako se sve potrebne informacije o korištenju Yahoo Finance APItehnologije nalaze na adresi:http://www.gummy-stuff.org/Yahoo-data.htm 

Web komponenta u akciji: Izravno korištenje Yahoo Finance APItehnologije.

Za sada toliko o ovoj temi. Nadamo se da vas je sve do sada

napisano potaklo da počnete razmišljati o razvoju vlastitihAndroid aplikacija, čak i ako niste programer, ili ako to nikada niste ni mislili postati.Kad savladate razvojni alat za neprogramere moţda ćete poţeljeti da se ubudućnosti počnete baviti i „pravim“ Google Android programiranjem. Na njegaćemo se ponovo vratiti u slijedećem nastavku, kako bi pokazali još nekolikonaprednijih tehnika korištenja osnovnog SDK alata.

Page 86: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 86/91

Android programiranje #17: Što je novo u 3.xizdanjima

Da čovjek jednostavno ne povjeruje kako vrijeme brzo leti – od početka serijala oprogramiranju korištenjem Googleovog razvojnog alata Android SDK, već je prošlo

više od godinu dana, a u međuvremenu se je mnogo toga dobrog dogodilo sasamim alatom u smislu proširenja njegovih mogućnosti. Za to je prije svega zasluţnaprava eksplozija pojave novih modela tablet računala, jer je upravo ona dovela dopotrebe optimiziranja Android sustava za takvu vrstu hardvera.

Novosti u alatu App Inventor for Android 

Prije nego se pozabavimo osnovnim Android SDK razvojnim sustavom

namijenjenom „pravim programerima“, napišimo nekoliko dodatnih riječi o

najnovijim vijestima povezanim s Googleovim alternativnim alatom za brzoprototipiranje aplikacija (App Inventor for Android), jer smo se upravo njime bavili

zadnjih nekoliko brojeva. Ako vam se alat dopao, pa zato planirate njegovo

dugoročnije korištenje, vaţno je znati što vam očekuje u budućnosti. 

Prvo, i trenutno najvaţnije, kao novu web adresa za online korištenje alata AppInventor for Android trebati će ubuduće koristiti www.appinventorbeta.com umjesto

dosadašnje adrese appinventor.googlelabs.com. U duhu vođenja brige za postojećekorisnike vlastitih proizvoda, uobičajenom kod velikih IT poduzeća, sve postojeće

aplikacije registriranih korisnika sačuvane su i dostupne na novoj adresi, tako da

nema potreba za nekakvim „prepisivanjem“ aplikacija s jedne adrese na drugo. 

Android 3.x: Donosi brojne promjene u korisničkom sučeljuoptimizirane za moderne tablet uređaje. 

Drugo, te jednako vaţno za buduće korištenje alata, Google prestaje s izravnim

radom na odrţavanju i razvoju alata App Inventor for Android. To na sreću ne značida će alat nestati, nego da on prelazi u „open source“ kategoriju. Za budući statusalata brigu će voditi novoosnovani Center for Mobile Learning u okviru MIT Media

Laba, te biti pod stalnim nadzorom tri profesora s istog sveučilišta:  Hal Abelson,

Eric Klopfer i Mitchel Resnik . Prva osoba iz nabrojene trojke zasluţna je zapredlaganje i pokretanje čitavog projekta 2008 godine zajedno s poduzećemGoogle, iz laboratorija drugog profesora potekla je prva verzija razvojnog alata, i to

upravo na temelju ideje zadnjeg imena s popisa. Dovršetak cijelog postupka očekuje

Page 87: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 87/91

se do kraja godine, a postojeći korisnici alata će redovito dobijati informacije o svimpromjenama.

Novosti u „osnovnom“ Android sustavu 

Nakon razjašnjavanja trenutne i buduće situacije s alatom za brzo prototipiranjeAndroid aplikacija, vratimo se sada na osnovni razvojni alat Android SDK. Od

trenutka početka pisanja serijala, kojeg upravo čitate, razvojni alat je promijenio

svoju prvu brojčanu oznaku verzije s 2 na 3, što uvijek znači da je došlo do bitnihpromjena u nekom softverskom paketu. Kao što smo to već spomenuli na samompočetku ovog teksta, ključni okidač za takve promjene je sveopća „zaluđenost“ tabletračunalima, kako od strane proizvođača, tako i od strane korisnika mobilnih uređaja.Budući da se po dijelu svojih hardverskih karakteristika takvi uređaji razlikuju odmobilnih telefona, Android sustav doţivio je bitne promjene što simbolizira nova

početna oznaka verzije. 

Pogledajmo prvo što se najvaţnijeg dogodilo sa stanovišta krajnjeg korisnika.Najvaţnije su, naravno, promjene na dimenzijama i rezoluciji zaslona, jer su ovevrijednosti u pravilu dosta veće nego kod mobilnih telefona. Povećanje zaslonapretpostavka je za dodatnu zabavu u korisničkom sučelju, kako u pogledu redizajnapostojećih dijelova, tako i u pogledu dodavanja potpuno novih dijelova sučeljapoput sistemske ili akcijske trake. Kad govorimo o promjenama u korisničkomsučelju onda se to odnosi na dio vidljiv na zaslonu, ali i na sistemske, grafički

orijentirane module u pozadin,i koji su također morali doţivjeti brojne promjene. 

Na većem zaslonu uređaja mogla se između ostalog redizajnirati softverskatipkovnica namijenjena unosu znakova. Tipkovnica je jednostavno postala udobnija

te brţa za korištenje nego prije, jer se do dijela tipki više ne mora dolaziti zaobilazno.Još jedna bitna stvar povezana s korisničkim sučeljem je poboljšana mogućnostupravljanja operacijama označavanja, isijecanja, kopiranja i umetanja teksta. Sada seza tu operaciju koriste dodatne strelice prikazane na zaslonu.

Promjene u poznatim aplikacijama: Na primjer, aplikacija za

upravljanje ugrađenom kamerom. 

Prva od prije spomenutih traka, smještena na samom dnu zaslona, namijenjena jeza brzi pristup obavijestima, statusnim pokazateljima sustava te navigacijskim

gumbima postavljenim na sam zaslon. U pravilu sistemska traka dostupna je stalno,

iako se ako je to baš potrebno moţe sakriti u slučaju da neka aplikacija treba

Page 88: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 88/91

iskoristiti cijeli dostupni prostor zaslona. Još jedan vaţan zadatak sistemske trake jeupravljanje višezadatkovnim radom preko popisa nedavno korištenih aplikacija(Recent Apps). Druga traka (akcijska) nalazi se na vrhu zaslona, a izgled i djelovanje

ovise joj o kontekstu izvođenja aplikacije, što znači da promjenom njezinog izgledaupravlja aplikacija, a ne sam Android sustav.

Od ostalih novosti svakako treba spomenuti nove mogućnosti povezivanja tabletračunala s vanjskim uređajima pomoću Media/Picture Transfer Protocola, odnosnopovezivanje prave tipkovnice s uređajem kako bi se još više olakšalo upisivanjeteksta. Na kraju tu je i nekoliko poboljšanja standardnih aplikacija – preglednik,

elektronička pošta, kamera, galerija i imenik. U još novijim verzijama nasljednicama soznaka 3.1 i 3.2 uvedena su dodatna unapređenja u korisničkom sučelju tepovezivanju s vanjskim uređajima (npr. različiti dodaci za igru) i Wi-Fi, dok je sam

Android sustav optimiziran za brojne tablet uređaje, koji su se na trţištu pojavili u

međuvremenu. 

U ovom nabrajanju ne smijemo nikako zaboraviti na još jednu promjenu, budući daona nije vidljiva na prvi pogled, ali pridonosi ukupnom zadovoljstvu korištenjaAndroid platforme. Osim što u verziji 3.x Android podrţava istovremeno korištenjevećeg broja aplikacija, sada se te aplikacije mogu izvoditi i na većem broju procesoraodnosno jezgri, ako je takva hardverska konfiguracija ugrađena u mobilni uređaj.Android uređaji tako će uskoro moći rješavati najsloţenije probleme, a da ne

spominjemo kako će dobro na njima izgledati različite igre. U međuvremenu su sena trţištu zaista pojavili višejezgreni uređaji, tako da ovo više nije samo teoretskamogućnost sustava. 

Sad kad smo ukratko naveli što je sve novo u sustavu sa stanovišta krajnjegkorisnika, pogledajmo što to zapravo znači za programere, ako ţele pisatioptimizirane aplikacije za nove verzije Andrioda s početnom verzijom 3. Svaka novaverzija Androida sa sobom donosi izmijenjeno programsko sučelje s određenimbrojem novih poziva API funkcija, odnosno izmjene u načinu korištenja postojećih

funkcija. Budući da su se u verziji 3.0 (i novijima) pojavili potpuno novi dijelovikorisničkog sučelja, kao što je akcijska traka ili sistemska traka, najvaţnije APIpromjene povezane su upravo s tim dijelovima. Drugim riječima, dobili smo sasvimdovoljno građe za još nekoliko nastavaka serijala u kojima bi se demonstriralenajnovije mogućnosti platforme. 

Navedimo sada primjer dijela programskog koda namijenje korištenju akcijsketrake u vlastitim aplikacijama, tek toliko da steknete dojam kako to izgleda Detaljnije

djelovanje programskog koda koji upravlja alatnom trakom, ali i drugim novostimaverzije 3.x objasnit ćemo na sloţenijem primjeru kojeg počinjemo izrađivati slijedećiput.

Page 89: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 89/91

package com.example.android.apis.app;

import com.example.android.apis.R;

import android.app.ActionBar;

import android.app.ActionBar.Tab;

import android.app.Activity;

import android.app.Fragment;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import android.widget.Toast;

public class ActionBarTabs extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.action_bar_tabs);

}

public void onAddTab(View v) {

final ActionBar bar = getActionBar();

final int tabCount = bar.getTabCount();

final String text = “Tab ” + tabCount; 

bar.addTab(bar.newTab()

.setText(text)

.setTabListener(new TabListener(new TabContentFragment(text))));

}

Page 90: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 90/91

public void onRemoveTab(View v) {

final ActionBar bar = getActionBar();

bar.removeTabAt(bar.getTabCount() – 1);

}

public void onToggleTabs(View v) {

final ActionBar bar = 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);

}

}

public void onRemoveAllTabs(View v) {

getActionBar().removeAllTabs();

}

private class TabListener implements ActionBar.TabListener {

private TabContentFragment mFragment;

public TabListener(TabContentFragment fragment) {

mFragment = fragment;

}

public void onTabSelected(Tab tab, FragmentTransaction ft) {

ft.add(R.id.fragment_content, mFragment, mFragment.getText());

}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {

Page 91: Android Skola Programiranja Android@Vidi Skola

8/10/2019 Android Skola Programiranja Android@Vidi Skola

http://slidepdf.com/reader/full/android-skola-programiranja-androidvidi-skola 91/91

ft.remove(mFragment);

}

public void onTabReselected(Tab tab, FragmentTransaction ft) {

Toast.makeText(ActionBarTabs.this, “Reselected!”, Toast.LENGTH_SHORT).show(); 

}

}

private class TabContentFragment extends Fragment {

private String mText;

public TabContentFragment(String text) {

mText = text;

}

public String getText() {

return mText;

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false);

TextView text = (TextView) fragView.findViewById(R.id.text);

text.setText(mText);

f