android skola programiranja android@vidi skola
TRANSCRIPT
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
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
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.
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
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.
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.
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.
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
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
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.
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.
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
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”);
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.
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
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
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 ).
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
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
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
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>
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” >
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
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();
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”);
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;
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)
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
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” });
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.
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).
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
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”
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).
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>
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.
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;
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
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.
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;
}
}
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.
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”;
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();
}
}
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] = “”;
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] = “”;
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”);
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.
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;
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
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=”<< 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″
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 {
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).
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();
}
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);
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);
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;
}
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();
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();
}
}
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.
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();
}
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
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;
}
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
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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“.
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.
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.
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.
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.
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.
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
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.
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
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.
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
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.
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
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
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.
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))));
}
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) {
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