<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>android@vidi</title>
	<atom:link href="http://android.vidilab.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://android.vidilab.com</link>
	<description>Škola Android programiranja časopisa Vidi</description>
	<lastBuildDate>Tue, 25 Oct 2011 17:28:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Android programiranje #17: Što je novo u 3.x izdanjima</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-17-sto-je-novo-u-3-x-izdanjima/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-17-sto-je-novo-u-3-x-izdanjima/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 17:28:44 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=310</guid>
		<description><![CDATA[Da čovjek jednostavno ne povjeruje kako vrijeme brzo leti – od početka serijala o programiranju 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 sa samim alatom u smislu proširenja njegovih mogućnosti. Za to je prije svega zaslužna prava eksplozija pojave novih <a href="http://android.vidilab.com/2011/10/android-programiranje-17-sto-je-novo-u-3-x-izdanjima/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Da čovjek jednostavno ne povjeruje kako vrijeme brzo leti – od početka serijala o programiranju 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 sa samim alatom u smislu proširenja njegovih mogućnosti. Za to je prije svega zaslužna prava eksplozija pojave novih modela tablet računala, jer je upravo ona dovela do potrebe optimiziranja Android sustava za takvu vrstu hardvera.</p>
<p><span id="more-310"></span></p>
<p><strong>Novosti u alatu App Inventor for Android</strong></p>
<p>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 brzo prototipiranje aplikacija (App Inventor for Android), jer smo se upravo njime bavili zadnjih nekoliko brojeva. Ako vam se alat dopao, pa zato planirate njegovo dugoročnije korištenje, važno je znati što vam očekuje u budućnosti.</p>
<p>Prvo, i trenutno najvažnije, kao novu web adresa za online korištenje alata App Inventor for Android trebati će ubuduće koristiti <a href="http://www.appinventorbeta.com">www.appinventorbeta.com</a> umjesto dosadašnje adrese  <a href="http://appinventor.googlelabs.com/" target="_blank">appinventor.googlelabs.com</a>. U duhu vođenja brige za postojeće korisnike 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.</p>
<div id="attachment_311" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/slika01.jpg"><img class="size-thumbnail wp-image-311" title="slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/slika01-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Android 3.x: Donosi brojne promjene u korisničkom sučelju optimizirane za moderne tablet uređaje.</p></div>
<p>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či da će alat nestati, nego da on prelazi u „open source“ kategoriju. Za budući status alata brigu će voditi novoosnovani <strong>Center for Mobile Learning</strong> u okviru MIT Media Laba, te biti pod stalnim nadzorom tri profesora s istog sveučilišta:  <strong>Hal Abelson, Eric Klopfer </strong>i<strong> Mitchel Resnik</strong>. Prva osoba iz nabrojene trojke zaslužna je za predlaganje  i pokretanje čitavog projekta 2008 godine zajedno s poduzećem Google, 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 se do kraja godine, a postojeći korisnici alata će redovito dobijati informacije o svim promjenama.</p>
<p><strong>Novosti u „osnovnom“ Android sustavu</strong></p>
<p>Nakon razjašnjavanja trenutne i buduće situacije s alatom za brzo prototipiranje Android 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 bitnih promjena u nekom softverskom paketu. Kao što smo to već spomenuli na samom početku ovog teksta, ključni okidač za takve promjene je sveopća „zaluđenost“ tablet rač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 od mobilnih telefona, Android sustav doživio je bitne promjene što simbolizira nova početna oznaka verzije.</p>
<p>Pogledajmo prvo što se najvažnijeg dogodilo sa stanovišta krajnjeg korisnika. Najvažnije su, naravno, promjene na dimenzijama i rezoluciji zaslona, jer su ove vrijednosti u pravilu dosta veće nego kod mobilnih telefona. Povećanje zaslona pretpostavka je za dodatnu zabavu u korisničkom sučelju, kako u pogledu redizajna postojećih dijelova, tako i u pogledu dodavanja potpuno novih dijelova sučelja poput sistemske ili akcijske trake. Kad govorimo o promjenama u korisničkom suč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.</p>
<p>Na većem zaslonu uređaja mogla se između ostalog redizajnirati softverska tipkovnica 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ćnost upravljanja operacijama označavanja, isijecanja, kopiranja i umetanja teksta. Sada se za tu operaciju koriste dodatne strelice prikazane na zaslonu.</p>
<div id="attachment_312" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/slika02.jpg"><img class="size-thumbnail wp-image-312" title="slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/slika02-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Promjene u poznatim aplikacijama: Na primjer, aplikacija za upravljanje ugrađenom kamerom.</p></div>
<p>Prva od prije spomenutih traka, smještena na samom dnu zaslona, namijenjena je za 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 iskoristiti cijeli dostupni prostor zaslona. Još jedan važan zadatak sistemske trake je upravljanje 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 izgleda upravlja aplikacija, a ne sam Android sustav.</p>
<p>Od ostalih novosti svakako treba spomenuti nove mogućnosti povezivanja tablet računala s vanjskim uređajima pomoću Media/Picture Transfer Protocola, odnosno povezivanje prave tipkovnice s uređajem kako bi se još više olakšalo upisivanje teksta. Na kraju tu je i nekoliko poboljšanja standardnih aplikacija – preglednik, elektronička pošta, kamera, galerija i imenik. U još novijim verzijama nasljednicama s oznaka 3.1 i 3.2 uvedena su dodatna unapređenja u korisničkom sučelju te povezivanju 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.</p>
<p>U ovom nabrajanju ne smijemo nikako zaboraviti na još jednu promjenu, budući da ona nije vidljiva na prvi pogled, ali pridonosi ukupnom zadovoljstvu korištenja Android platforme. Osim što u verziji 3.x Android podržava istovremeno korištenje većeg broja aplikacija, sada se te aplikacije mogu izvoditi i na većem broju procesora odnosno 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 se na tržištu zaista pojavili višejezgreni uređaji, tako da ovo više nije samo teoretska mogućnost sustava.</p>
<p>Sad kad smo ukratko naveli što je sve novo u sustavu sa stanovišta krajnjeg korisnika, pogledajmo što to zapravo znači za programere, ako žele pisati optimizirane aplikacije za nove verzije Andrioda s početnom verzijom 3. Svaka nova verzija Androida sa sobom donosi izmijenjeno programsko sučelje s određenim brojem 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 dijelovi korisničkog sučelja, kao što je akcijska traka ili sistemska traka, najvažnije API promjene povezane su upravo s tim dijelovima. Drugim riječima, dobili smo sasvim dovoljno građe za još nekoliko nastavaka serijala u kojima bi se demonstrirale najnovije mogućnosti platforme.</p>
<p>Navedimo sada primjer dijela programskog koda namijenje korištenju akcijske trake u vlastitim aplikacijama, tek toliko da steknete dojam kako to izgleda Detaljnije djelovanje programskog koda koji upravlja alatnom trakom, ali i drugim novostima verzije 3.x objasnit ćemo na složenijem primjeru kojeg počinjemo izrađivati slijedeći put.</p>
<p>package com.example.android.apis.app;</p>
<p>import com.example.android.apis.R;</p>
<p>import android.app.ActionBar;</p>
<p>import android.app.ActionBar.Tab;</p>
<p>import android.app.Activity;</p>
<p>import android.app.Fragment;</p>
<p>import android.app.FragmentTransaction;</p>
<p>import android.os.Bundle;</p>
<p>import android.view.LayoutInflater;</p>
<p>import android.view.View;</p>
<p>import android.view.ViewGroup;</p>
<p>import android.widget.TextView;</p>
<p>import android.widget.Toast;</p>
<p>public class ActionBarTabs extends Activity {</p>
<p>@Override</p>
<p>protected void onCreate(Bundle savedInstanceState) {</p>
<p>super.onCreate(savedInstanceState);</p>
<p>setContentView(R.layout.action_bar_tabs);</p>
<p>}</p>
<p>public void onAddTab(View v) {</p>
<p>final ActionBar bar = getActionBar();</p>
<p>final int tabCount = bar.getTabCount();</p>
<p>final String text = &#8220;Tab &#8221; + tabCount;</p>
<p>bar.addTab(bar.newTab()</p>
<p>.setText(text)</p>
<p>.setTabListener(new TabListener(new TabContentFragment(text))));</p>
<p>}</p>
<p>public void onRemoveTab(View v) {</p>
<p>final ActionBar bar = getActionBar();</p>
<p>bar.removeTabAt(bar.getTabCount() &#8211; 1);</p>
<p>}</p>
<p>public void onToggleTabs(View v) {</p>
<p>final ActionBar bar = getActionBar();</p>
<p>if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) {</p>
<p>bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);</p>
<p>bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);</p>
<p>} else {</p>
<p>bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);</p>
<p>bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);</p>
<p>}</p>
<p>}</p>
<p>public void onRemoveAllTabs(View v) {</p>
<p>getActionBar().removeAllTabs();</p>
<p>}</p>
<p>private class TabListener implements ActionBar.TabListener {</p>
<p>private TabContentFragment mFragment;</p>
<p>public TabListener(TabContentFragment fragment) {</p>
<p>mFragment = fragment;</p>
<p>}</p>
<p>public void onTabSelected(Tab tab, FragmentTransaction ft) {</p>
<p>ft.add(R.id.fragment_content, mFragment, mFragment.getText());</p>
<p>}</p>
<p>public void onTabUnselected(Tab tab, FragmentTransaction ft) {</p>
<p>ft.remove(mFragment);</p>
<p>}</p>
<p>public void onTabReselected(Tab tab, FragmentTransaction ft) {</p>
<p>Toast.makeText(ActionBarTabs.this, &#8220;Reselected!&#8221;, Toast.LENGTH_SHORT).show();</p>
<p>}</p>
<p>}</p>
<p>private class TabContentFragment extends Fragment {</p>
<p>private String mText;</p>
<p>public TabContentFragment(String text) {</p>
<p>mText = text;</p>
<p>}</p>
<p>public String getText() {</p>
<p>return mText;</p>
<p>}</p>
<p>@Override</p>
<p>public View onCreateView(LayoutInflater inflater, ViewGroup container,</p>
<p>Bundle savedInstanceState) {</p>
<p>View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false);</p>
<p>TextView text = (TextView) fragView.findViewById(R.id.text);</p>
<p>text.setText(mText);</p>
<p>return fragView;</p>
<p>}</p>
<p>}</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-17-sto-je-novo-u-3-x-izdanjima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #16: Korištenje kartografskih servisa</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-16-koristenje-kartografskih-servisa/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-16-koristenje-kartografskih-servisa/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 17:26:30 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=303</guid>
		<description><![CDATA[U današnjem završnom nastavku svojevrsnog podserijala o korištenju Googleovog alata za brzo prototipiranje aplikacija, pokazat ćemo kako se u okviru tog alata koriste kartografske mogućnosti Googleovih servisa, jedne od najčešće korištenih tehnologija u aplikacijama na mobilnim uređajima. Dodatna vrlo zanimljiva razvojna tehnika demonstrirana u istom primjeru je pozivanje jedne Android aplikacije iz druge Android aplikacije. <a href="http://android.vidilab.com/2011/10/android-programiranje-16-koristenje-kartografskih-servisa/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>U današnjem završnom nastavku svojevrsnog podserijala o korištenju Googleovog alata za brzo prototipiranje aplikacija, pokazat ćemo kako se u okviru tog alata koriste kartografske mogućnosti Googleovih servisa, jedne od najčešće korištenih tehnologija u aplikacijama na mobilnim uređajima. <span id="more-303"></span>Dodatna vrlo zanimljiva razvojna tehnika demonstrirana u istom primjeru je pozivanje jedne Android aplikacije iz druge Android aplikacije. Već smo nekoliko puta spomenuli kako je trenutno jedno od najvećih ograničenja Googleovog razvojnog alata za neprogramere u tome što se unutar jedne aplikacije može koristiti samo jedan raspored kontrola. Upravo sposobnošću pozivanja jedne aplikacije iz druge može se zaobići spomenuto ograničenje. Način korištenja kartografskih servisa na kojem se temelji današnji tekst prikazan je u Googeovom primjeru pripremljenom od strane profesora Davida Wolbera sa sveučilišta u San Franciscu.</p>
<p>Prije nego što nastavimo s detaljnijim objašnjavanjem primjera istaknimo na ovom mjestu još jednu bitnu mogućnost operativnog sustava Android u pogledu izrade rješenja koje se sastoji od većeg broja sastavnih dijelova. Dok za pozivanje drugog dijela 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.</p>
<div id="attachment_304" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika018.jpg"><img class="size-thumbnail wp-image-304" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika018-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Prvi dio aplikacije (sučelje): Sastoji se od tri osnovne kontrole: Image1, ListPicker1 i ActivityStater1.</p></div>
<p>U prvom dijelu aplikacije na osnovni zaslon projekta postavljene su svega tri kontrole: <strong>Image1</strong>, <strong>ListPicker1</strong> i <strong>ActivityStater1</strong>.            Kontrole su redom namijenjene za prikaz početne slike programa, izbor triju različitih odredišta za prikaz na karti, te na kraju komponente za pokretanje dodatne kartografski orijetirane aplikacije. Prve dvije kontrole ne bi trebale biti posebno teške za korištenje, tako da ih nećemo ni posebno opisivati. Uostalom, kontrolu za prikaz slika koristili smo već u prvom, najtrivijalnijem primjeru korištenja alata.</p>
<p>Nešto više vremena posvetit ćemo korištenju komponente ActivityStarter, zato što ona zahtijeva oblik znanja kakav je uobičajen u krugovima pravih Android programera, ali nije baš uobičajen za korisnike neprogramere. Drugim riječima, druga komponenta cjelokupnog rješenja mora se pozvati iz prve prema točnom definiranom protokolu, što bi u ovom slučaju imalo otprilike slijedeći oblik:</p>
<p>ActivityStarter svojstvo              Vrijednost</p>
<p><strong>Action</strong> android.intent.action.VIEW</p>
<p><strong>ActivityClass</strong> com.google.android.maps.MapsActivity</p>
<p><strong>ActivityPackage</strong> com.google.android.apps.maps</p>
<div id="attachment_307" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika043.jpg"><img class="size-thumbnail wp-image-307" title="Slika04" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika043-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Prvi dio aplikacije (programski blokovi): Najvažniji dio povezan je aktivnostima kontrole ActivityStarter.</p></div>
<p>Programski blokovi povezani s aplikacijom podijeljeni su u dva dijela. Prvi dio je zajedno s pratećim deklaracijama vrijednostima zadužen za pripremu početnog izgleda aplikacije (vidi prateću sliku uz tekst), dok se drugi izvodi nakon odabira neke od zadanih lokacija: &#8220;Tour Eiffel&#8221;, „Musee du Louvre“ i „Cathedrale Notre Dame“. Nakon odabira jednog od navedena tri mjesta iz popisa prelazi se na izvođenje programskog bloka <strong>ListPicker1.AfterPicking</strong>.</p>
<p>Na ovom mjestu dolazimo do male dodatne komplikacija pa je treba objasniti nešto detaljnije. Da bi se pomoću komponente ActivityStarter mogla uspješno pokrenuti 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či popunjavanje svojstva <strong>ActivityStater.DataUri</strong>. U spomenuto svojstvo mora se postaviti kombinacija vrijednosti „<strong>geo:0,0?q=“ </strong>te konkretne vrijednosti za izabranu lokaciju iz popisa dostupnih mjesta (<strong>ListPicker1.Selection</strong>). Za to se koristi posebni programski blok zadužen za rukovanje nizovima znakova (<strong>make text</strong>). U slučaju odabira druge od dostupnih vrijednosti dobije se konačna vrijednost: <strong>geo:0,0?q=&#8217;Musee du Louvre&#8217;</strong>.</p>
<div id="attachment_306" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika033.jpg"><img class="size-thumbnail wp-image-306" title="Slika03" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika033-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Izvođenje aplikacije: Osnovni oblik izvođenja aplikacije u Android emulatoru.</p></div>
<p>Sad je konačno sve spremno za pozivanje drugog dijela aplikacije, pa prvi dio aplikacije 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 standardne operacije u operativnom sustavu Android.</p>
<p>„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 objekta mnogo preciznije zada način prikaza nekog mjesta prema sintaksi propisanoj od strane Googlea. Na primjer, za znatno atraktivniji način prikaza svih triju lokacija mogla bi se navesti „malo složenije odrednice“:</p>
<p>Eiffel Tower</p>
<p>http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=eiffel+tower&amp;sll=37.0625,-95.677068</p>
<p>&amp;sspn=48.909425,72.333984&amp;ie=UTF8&amp;hq=Tour+Eiffel&amp;hnear=Tour+Eiffel,+Quai+Branly,+75007+Paris,+Ile-de-France,+France&amp;ll=48.857942,2.294748&amp;spn=0.001249,0.002207&amp;t=h&amp;z=19</p>
<p>Musee Louvre</p>
<p>http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;q=louvre&amp;sll=48.86096,2.335421&amp;sspn=0.002499,0.004415&amp;ie=UTF8&amp;t=h&amp;split=1</p>
<p>&amp;filter=0&amp;rq=1&amp;ev=zi&amp;radius=0.12&amp;hq=louvre&amp;hnear=&amp;ll=48.86096,2.335421&amp;spn=0.002499,0.004415&amp;z=18</p>
<p>Notre Dame, Street View</p>
<p>ttp://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;q=french+landmarks&amp;sll=48.853252,2.349111&amp;sspn=0.002411,0.004415</p>
<p>&amp;ie=UTF8&amp;t=h&amp;radius=0.12&amp;split=1&amp;filter=0&amp;rq=1&amp;ev=zi&amp;hq=french+landmarks&amp;hnear=&amp;ll=48.853252,2.349111&amp;spn=0,0.004415</p>
<p>&amp;z=18&amp;layer=c&amp;cbll=48.853046,2.348861&amp;panoid=74fLTqeYdgkPYj6KKLlqgQ&amp;cbp=12,63.75,,0,-35.58</p>
<p>U slučaju da želite provjeriti sami kako sve to skupa lijepo djeluje u praksi, a nemaze ni vremena ni volje da ispočetka razvijate cijelu aplikaciju, možete krenuti linijom manjeg otpora te usmjeriti svoj preglednik na adresu <a href="http://appinventor.googlelabs.com/learn/tutorials/maptour/maptour.html">http://appinventor.googlelabs.com/learn/tutorials/maptour/maptour.html</a></p>
<p><strong>Kontinuirani razvoj alata</strong></p>
<div id="attachment_307" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika043.jpg"><img class="size-thumbnail wp-image-307" title="Slika04" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika043-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Napredno izvođenje aplikacije: U prikaz su uključene dodatne opcije za prikaz slika na zadanoj lokaciji.</p></div>
<p>U razdoblju od prvog spominjanja razvojnog alata App Inventor for Android u ovom serijalu, pa do današnjeg nastavka, Googleovi razvojni inženjeri marljivo su radili 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 alat slijedeći put pokrene nakon njegovog ažuriranja na Googleovom serveru.</p>
<p>Osim ispravke uočenih pogrešaka prijavljenih od strane korisnika, izgleda da se najintenzivnije radi na daljnjim doradama komponenti u okviru kolekcije <strong>Other Stuff</strong>. Komponenta<strong> Web</strong> zamišljena je tako da osigurava dodatne mogućnosti u izravnom preuzimanju podataka s web servera, za što se do sada morao koristiti poseban 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 dodati prikaz različitih poslovnih informacija o čijoj pripremi i pouzdanosti brine Yahoo.</p>
<p>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 API tehnologije nalaze na adresi: <a href="http://www.gummy-stuff.org/Yahoo-data.htm">http://www.gummy-stuff.org/Yahoo-data.htm</a></p>
<div id="attachment_308" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika052.jpg"><img class="size-thumbnail wp-image-308" title="Slika05" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika052-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Web komponenta u akciji: Izravno korištenje Yahoo Finance API tehnologije.</p></div>
<p>Za sada toliko o ovoj temi. Nadamo se da vas je sve do sada napisano potaklo da počnete razmišljati o razvoju vlastitih Android 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 u budućnosti počnete baviti i „pravim“ Google Android programiranjem. Na njega ćemo se ponovo vratiti u slijedećem nastavku, kako bi pokazali još nekoliko naprednijih tehnika korištenja osnovnog SDK alata.</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-16-koristenje-kartografskih-servisa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #15: Izrada složenijih aplikacija</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-15-izrada-slozenijih-aplikacija/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-15-izrada-slozenijih-aplikacija/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 16:53:55 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=298</guid>
		<description><![CDATA[Nakon što smo u prošlih nekoliko nastavaka predstavili najvažnije dijelove Googleovog alata za razvoj aplikacija namijenjenog korisnicima neprogramerima, odnosno malo manje vještim programerima, došao je trenutak da pokažemo kako se ti 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 <a href="http://android.vidilab.com/2011/10/android-programiranje-15-izrada-slozenijih-aplikacija/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Nakon što smo u prošlih nekoliko nastavaka predstavili najvažnije dijelove Googleovog alata za razvoj aplikacija namijenjenog korisnicima neprogramerima, odnosno malo manje vještim programerima, došao je trenutak da pokažemo kako se ti 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 potrebne da se dobije dovršena aplikacija, u današnjem nastavku ćemo samo naznačiti glavne smjernice 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štenju alata.</p>
<p><span id="more-298"></span></p>
<p>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 sve do igranja različitih vrsta igara, mogućnost izvođenja starog, dobrog telefonskog poziva (ili bar odgovaranja na njega) još uvijek ostaje jedna od najbitnijih namjena većine mobilnih telefona. Zato ćemo u prvom primjeru nešto složenije aplikacije demonstrirati što možemo napraviti u Googlevom razvojnom alatu po tom pitanju, ako ne želimo koristiti već ugrađene mogućnosti u sam uređaj.</p>
<p>Pretpostavka za uspješno izvođenje slijedeće aplikacije na konkretnom Android uređaju je da taj uređaj podržava izvođenje telefonskih poziva, a ne samo različite internet orijentirane načine vlastitog korištenja (pregled web stranica, razmjena email poruka i slično). Također, u spremište kontakata u uređaju trebalo bi biti upisano bar nekoliko telefonskih brojeva, a nekima od brojeva trebale bi biti dodijeljenje slike njihovih vlasnika. Čak i ako svi nabrojeni zahtjevi budu zadovoljeni, može se dogoditi da 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 ni testiran 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 bliskoj budućnosti kad razvojni alat više ne bude u fazi svojevrsnog testiranja.</p>
<p>Za uspostavu telefonskog poziva iz Android uređaja, kao što to već znate, treba kreirati novi prazan projekt te mu dodijeliti nekakav naziv koji simbolizira namjenu projekta. U pripremi primjera povezanog s ovim tekstom korišten je naziv <strong>VidiPhoneCall</strong>, 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 samom početku potrebne samo dvije: komponenta <strong>PhoneCall </strong>iz grupe <strong>Social</strong> te komponenta <strong>Button</strong> iz grupe <strong>Basic</strong>. U nastavku teksta ćemo slične konstrukcije skraćeno pisati <strong>Social -&gt; PhoneCall</strong>, odnosno  <strong>Basic -&gt; Button</strong>.</p>
<div id="attachment_299" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika017.jpg"><img class="size-thumbnail wp-image-299" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika017-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Social -&gt;  Phone Call: Temeljna komponenta za izvođenje telefonskog poziva iz vlastite Android aplikacije.</p></div>
<p>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 mogu izravno koristiti za dovršetak projekta, ali dobra praksa iskusnijih programera predlaže njihovo preimenovanje u daleko razumljivije nazive, kako bi se kasnije olakšalo snalaženje u projektu. Što se u nekom projektu koristi više različitih komponenti (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 i izmjeni programskog koda. Dobro, kod alata App Inventor zapravo ni ne možemo govoriti baš o „pisanju programskog koda“, jer je prije riječ o nećemu nalik slaganju komada slagalice sastavljene od dostupnih događaja i metoda korištenih komponeti, ali nema nikakvog razloga da ignoriramo pravilo o imenovanju komponenti.</p>
<p>Preimenovanje komponente postavljene na osnovni zaslon projekta izvodi se njezinim označavanjem, te klikom na gumb &lt;Rename&gt; u razvojnoj okolini alata.  Za potrebe ovog projekta komponentu PhoneCall1 preimenovali smo u <strong>TelefonskiPoziv</strong>, a komponetu Button1 u <strong>UspostaviPoziv</strong>. Još jednom ponavljamo &#8211; budući da bi rad na ovom projektu trebao ujedno biti vaša samostalna vježba korištenja Googleovog razvojnog alata, nazive komponenti možete izabrati prema vlastitim sklonostima. Za komponentu TelefonskiPoziv može se izmijeniti i početna vrijednost svojstva PhoneNumber na željeni broj pozivatelja (ako se pozivi najčešće upućuju na taj broj), dok komponenti UspostaviPoziv treba izmijeniti svojstvo <strong>Text</strong>, kako bi zamjena za podrazumijevanu vrijednost <strong>Text for Button1</strong> preciznije pokazivala namjenu gumba.</p>
<p>U ovom trenutku je dovršeno „crtanje“ korisničkog sučelja, a sad preostaje još samo to da se „napiše  odgovarajući programski kod“, odnosno dovrši slagalica u inovativnom Googleovom sučelju za tu namjenu (o čijem korištenju je bilo više riječi u prvom nastavku serijala). Sasvim konkretno &#8211; u ovom slučaju potrebno je napraviti povezivanje bloka <strong>Click</strong> iz kontrole UpostaviPoziv s blokom <strong>MakePhoneCall </strong>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. Djelovanje programa 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 Googleovih razvojnih inženjera.</p>
<p>Na trenutnom stupnju razvoja naše nove aplikacije trebalo bi biti moguće uspostaviti telefonski poziv, ali aplikacija još uvijek „nema pojma“ o podacima zapisanim u bazu kontakata u okviru samog uređaja, nego se svi telefonski brojevi moraju upisivati u cijelosti.  Budite iskreni pa priznajte sami sebi koliko često u praksi zaista izvodite operaciju upisivanja broja pozivatelja u odnosu na učestalost biranja dostupnih brojeva iz baze kontakata. Zato aplikaciju treba dodatno proširiti tako da postane „svjesna“ ranije pripremljenih telefonskih brojeva.</p>
<div id="attachment_300" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika025.jpg"><img class="size-thumbnail wp-image-300" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika025-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Dovršeno sučelje aplikacije za telefoniranje: Omogućava korištenje podataka iz spremišta kontakata u samom uređaju.</p></div>
<p>U drugoj verziji aplikacije ćemo na osnovni zaslon aplikacije dodati još jednu novu kontrolu: <strong>Social -&gt; PhoneNumberPicker</strong>, a onda joj izmijeniti predloženi naziv u <strong>IzaberiBroj</strong>, odnosno tekst koji se prikazuje na kontroli s početne vrijednosti <strong>Text for PhoneNumberPicker1</strong> za hrvatsku verziju aplikacije primjereniji oblik <strong>Izaberi broj</strong>. Kontrola tipa PhoneNumberPicker predstavlja svojevrsnu verziju običnog gumba, 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 smo zaista 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.</p>
<p>Da bi se na temelju izabranog podatka iz popisa kontakata zaista ostvario telefonski poziv, potrebno je spojiti blok <strong>AfterPicking</strong> kontrole IzaberiBroj s blokom <strong>MakePhoneCall </strong>iz kontrole TelefonskiPoziv. Potrebno je napraviti još prijenos odgovarajućeg parametra (izabranog telefonskog broja) između te dvije kontrole, što se izvodi dodatnim vezanjem bloka <strong>PhoneNumber</strong> kontrole IzaberiBroj s prije navedenim blokom MakePhoneCall. Ovim korakom, ako je sve pravilno izvedeno, trebala bi biti dovršena druga faza u razvoju aplikacije. Sada je aplikacija spremna za izvođenje telefonskih poziva na temelju prije spremljenih podataka u bazu kontakata.</p>
<p>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že izabrati 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 slike vlasnika telefonskog broja, ako takva postoji u uređaju. Unapređenje korisničkog sučelja aplikacije može se postići tako da se u okviru istog bloka <strong>AfterPicking</strong> kontrole IzaberiBroj, naprave dva dodatna povezivanja. Blok <strong>PhoneNumber</strong> iz kontrole IzaberiBroj treba povezati s blokom <strong>Text</strong> ranije opisanog gumba UspostaviPoziv, a blok <strong>Picture </strong>iz kontrole IzaberiBroj<strong> </strong>spojiti s blokom <strong>Image</strong>, 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.</p>
<p>Trenutna verzija aplikacija se i dalje može nadograđivati, pa evo nekoliko ideja koje možete probati napraviti sami:</p>
<ol>
<li>Osim prijenosa broja koji se      poziva  iz baze spremljenih      kontakata, probajte prenijeti još neke podatke na osnovni zaslon      aplikacije (prije svega prezime i ime 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 za realizaciju.</li>
<li>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 biti neki drugi put.</li>
</ol>
<p>Na kraju, ambiciozniji čitatelji mogu probati sami napraviti sličan projekt ispočetka tako da se umjesto uspostave telefonskog poziva izvodi slanje dobre, stare SMS poruke. U tom slučaju temeljnu kontrolu za rad aplikacije <strong>(Social -&gt; PhoneCall)</strong>, treba zamijeniti nečim drugim, ali vam to sada nećemo otkriti, nego vam ostavljamo da 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ći projekt, gdje ćemo još manje detaljizirati oko biranja kontrola i njihovog korištenja nego š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.</p>
<p>Piše: Nenad Crnko</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-15-izrada-slozenijih-aplikacija/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #14: Alternativni pristup razvoju aplikacija III</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-14-alternativni-pristup-razvoju-aplikacija-iii/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-14-alternativni-pristup-razvoju-aplikacija-iii/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 16:47:26 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=290</guid>
		<description><![CDATA[Danas ćemo se pozabaviti preostalim komponentama dostupnim u Googleovom alatu App Inventor for Android namijenjenom brzom razvoju Android aplikacija. Komponente su razvrstane u nekoliko grupa slijedećih naziva: Sensors, Screen Arrangement, LEGO MINDSTORMS, Other stuff i Not ready for prime time. Krenimo redom. Sensors komponente Danas je sasvim uobičajeno da pametni telefoni i drugi uređaji temeljeni <a href="http://android.vidilab.com/2011/10/android-programiranje-14-alternativni-pristup-razvoju-aplikacija-iii/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Danas ćemo se pozabaviti preostalim komponentama dostupnim u Googleovom alatu App Inventor for Android namijenjenom brzom razvoju Android aplikacija. Komponente su razvrstane u nekoliko grupa slijedećih naziva: <strong>Sensors</strong>, <strong>Screen Arrangement</strong>, <strong>LEGO MINDSTORMS</strong>, <strong>Other stuff </strong>i <strong>Not ready for prime time</strong>. Krenimo redom.</p>
<p><span id="more-290"></span></p>
<div id="attachment_291" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika016.jpg"><img class="size-thumbnail wp-image-291" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika016-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Sensors komponente: Zadužene su za upravljanje različitim senzorima u mobilnom uređaju.</p></div>
<p><strong> </strong></p>
<p><strong>Sensors</strong> komponente</p>
<p>Danas je sasvim uobičajeno da pametni telefoni i drugi uređaji temeljeni na Androidu imaju ugrađen manji ili veći broj senzora, koji se mogu vrlo djelotvorno iskoristiti u različitim vrstama aplikacija (najčešće igrama). Zbog toga je razvijeno nekoliko posebnih komponenti za relativno jednostavnu podršku takvoj vrsti hardvera. Sve komponente su nevidljive tijekom izvođenja, ali moraju biti uključene u aplikaciju da bi se mogle iskoristiti njihove mogućnosti.</p>
<p>Komponenta <strong>AccelerometerSensor</strong> zadužena je za interakciju softvera sa senzorom za mjerenje pomicanja uređaja po sve tri osi koordinatnog sustava. Od tuda dolaze nazivi najvažnijih svojstava: XAccel, YAccel, Zaccel. Pomoću svojstva Available programer može provjeriti jesu li navedeni senzor uopće dostupni u uređaju, a svojstvom Enabled upravljati dozvolom korištenja senzora. Događajem AccelerationChanged 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“ Shaking namijenjen 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čitih operacija u aktivnoj aplikaciji.</p>
<p>Druga nevidljiva kontrola iz iste skupine je <strong>LocationSensor</strong>, a namijenjena je dobijanju geografske pozicije mobilnog uređaja, ako je u njega ugrađen odgovarajući GPS prijemnik (svojstvo HasLongitudeLatitude). Softverski je podržano mjerenje nadmorske visine (svojstvo HasAltitude), ako i takva mogućnost postoji u hardveru. Ostalim dostupnim svojstvima može se dobiti vrijednost svake od navedenih tri dimenzija, dok su događaji LocationChanged te StatusChanged zaduženi za reakciju aplikacije na promjene pozicije uređaja u prostoru, odnosno na promjene načina mjerenja pozicije (izravno dobijeni GPS podaci ili podaci dobijeni od mrežnog operatora).</p>
<p><strong> </strong></p>
<p>Zadnja komponenta iz grupe <strong>OrientationSensor</strong> zadužena je za provjeru orijentacije uređaja u prostoru (svojstva Roll, Pitch i Yaw te događaj OrientationChanged). Ova sofverska komponenta se u kombinaciji s pripadajućim senzorom koristi u različitim aplikacijama za promjenu načina prikaza podataka ovisno o promjeni orijentacije uređaja (vodoravni ili vertikalni prikaz podataka).</p>
<p><strong>Screen Arrangement</strong> komponente</p>
<div id="attachment_292" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika024.jpg"><img class="size-thumbnail wp-image-292" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika024-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Screen Arrangement komponente: Koriste se kao „podloga“ za raspored drugih kontrola.</p></div>
<p>Sve tri komponente iz ove grupe (HorizontalArrangement, TableArrangement i HorizontalArrangement) zadužene su za jednostavnije raspoređivanje ostalih komponenti po zaslonu uređaja. Kao što im i nazivi govore, svaka od komponenti je zadužena za jednu vrstu rasporeda osnovnih kontrola. Osim za početno raspoređ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).</p>
<p><strong>LEGO MINDSTORMS</strong> komponente</p>
<p>Sedam komponenti iz grupe <strong>LEGO MINDSTORMS</strong> predviđene su za upravljanje različitih dijelovima poznatog Lego kompleta za učenje robotike pomoću nekog od Android 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 dijelom razvojnog alata. Nadamo se da ćemo u ne tako dalekoj budućnosti ipak biti u prilici isprobati simbozu Lego i Google proizvoda.</p>
<p><strong>Other stuff</strong> komponente</p>
<div id="attachment_293" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika032.jpg"><img class="size-thumbnail wp-image-293" title="Slika03" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika032-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">LEGO MINDSTORMS komponente: Zadužene su za povezivanje s Lego „očvrsjem“.</p></div>
<p>Šaroliko društvo softverskih komponenti iz ove grupe nikako se po svojoj namjeni ne može dovesti u izravnu vezu, zbog čega je cijela grupa dobila naziv koji označava takvu raznolikost.</p>
<p>Jedna od najvažnijih komponenti iz grupe je komponenta <strong>ActivityStater</strong>. 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), aplikacije zaduž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 komponenta podržava različite načine vlastitog pozivanja. Evo primjera iz prateće dokumentacije zaduženog za pretraživanje weba u „potrazi za vampirima“.</p>
<p>Action: android.intent.action.WEB_SEARCH</p>
<p>ExtraKey: query</p>
<p>ExtraValue: vampire</p>
<p>ActivityPackage: com.google.android.providers.enhancedgooglesearch</p>
<p>ActivityClass: com.google.android.providers.enhancedgooglesearch.Launcher</p>
<p>Komponenta <strong>BarcodeScanner</strong> 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 takva komponenta jednostavno neizostavna u modernim softverskim rješenjima, autor teksta može posvjedočiti iz prve ruke. Na nedavno završenoj Microsoftovoj konferenciji Windays 11 u Rovinju, osim očekivanih mjesta za takvu vrstu označavanja, dvodimenzionalni bar kodovi su se mogli primijetiti i na majicama nekih 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 što vam želi odati o sebi.</p>
<div id="attachment_294" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika042.jpg"><img class="size-thumbnail wp-image-294" title="Slika04" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika042-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Other stuff komponente: Ostale komponente koje se koriste u razvoju.</p></div>
<p>Dvije komponente sličnog naziva <strong>BluetoothServer </strong>i<strong> BluetoothClient </strong>zadužene su za 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 detalj Bluetooth tehnologije, tako da se u ovom tekstu jednostavno ne možemo detaljnije pozabaviti njihovim korištenjem. Kako je potpisnik ovih redova u bliskoj prošlosti imao prilike raditi na Bluetooth orijentiranom projektu namijenjenom starim dobrim Java MIDP uređajima, osobno može potvrditi da je korištenje Google tehnologije na istom području bitno jednostavnije. Budući da sami razvojni inženjeri tvrde da se na ovom segmentu razvojnog alata još uvijek intenzivno radi, ipak treba malo sačekati sa završnom ocjenom.</p>
<p>Komponenta <strong>Notifier</strong> 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činom prikaza informacija korisniku odnosno njihovom bilježenju. Na raspolaganju su također dva događaja: AfterChoosing i ShowChooseDialog, kako bi se moglo ustanoviti što je poduzeo korisnik kao reakciju na prikazane informacije od strane aplikacije.</p>
<p>Zadnje dvije komponente iz grupe (<strong>SpeechRecognizer </strong>i<strong> TextToSpeech</strong>) zamišljene su kao podrška za izradu govorno orijentiranog korisničkog sučelja u vlastitim Android 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 na upotrebu jednostavnih metoda poput GetText, Speek, Country i Language.</p>
<p>Spomenimo na ovom mjestu kako se za izgovor napisanog teksta koristi ista Google tehnologija koja je korištena u serijalu o naprednom programiranju Windows aplikacija, objavljenom u više prethodnih brojeva vašeg omiljenog časopisa.</p>
<p><strong>Not ready for prime time</strong> komponente</p>
<div id="attachment_295" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika051.jpg"><img class="size-thumbnail wp-image-295" title="Slika05" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika051-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Not ready for prime time komponente: Eksperimentalne komponente u intenzivnoj fazi razvoja.</p></div>
<p>U posljednoj grupi komponenti navedene su komponente na čijem razvoju još uvijek intenzivno rade Googleovi razvojni inženjeri, pa su kao takve podložne različitim promjenama dok ne stignu u fazu dovršenog proizvoda. Trenutno su u tu grupu svrstane slijedeće komponente:</p>
<p><strong> </strong></p>
<p><strong>FusionTablesControl </strong> &#8211; korištenje kartografskih prikaza u kombinaciji s FusionTables tehologijom.</p>
<p><strong>GameClient</strong> – povezivanje aplikacija (najčešće igara) s odgovarajućim serverima za „udružene NEzločinačke poduhvate“.</p>
<p><strong>SoundRecorder</strong> – bilježenje i pohranjivanje zvučnih zapisa.</p>
<p><strong> </strong></p>
<p><strong>TinyWebDB</strong> – komunikacija s web servisima zbog dvosmjerne razmjene podataka.</p>
<p><strong> </strong></p>
<p><strong>Voting</strong> – osnova za buduće glasačke listiće u „Android demokraciji budućnosti“.</p>
<p>Kako su sve nabrojane komponente iz ove grupe u razvoju, za sada se nećemo previš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 na prilično velike iznose kako će takvu tehnologiju prije prihvatiti različiti „reality“ spektakli nego državna uprava. Živi bili pa vidjeli.</p>
<p>Ovime je završeno predstavljanje najvažnijih segmenata Googleovog razvojnog alata za neprogramere. Preostalo je da pomoću njega probamo napraviti jednu složeniju aplikaciju kao demonstraciju kako različite komponente surađuju u praksi.</p>
<p>Piše: Nenad Crnko</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-14-alternativni-pristup-razvoju-aplikacija-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #13: Alternativni pristup razvoju aplikacija II</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-13-alternativni-pristup-razvoju-aplikacija-ii/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-13-alternativni-pristup-razvoju-aplikacija-ii/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 16:40:29 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=283</guid>
		<description><![CDATA[Prošli put smo demonstrirali osnove korištenja Googleovog alternativnog alata za razvoj Android aplikacija namijenjenog neprogramerima i „malo manje spretnim programerima“. App Inventor for Android, kako je njegov naziv, pokazao se sasvim prikladnim za stvaranje elementarne Android aplikacije (nešto slično klasičnom Hello World primjeru), a danas ćemo probati prikazati da je upotrebljiv za bitno složenije projekte. <a href="http://android.vidilab.com/2011/10/android-programiranje-13-alternativni-pristup-razvoju-aplikacija-ii/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Prošli put smo demonstrirali osnove korištenja Googleovog alternativnog alata za razvoj Android aplikacija namijenjenog neprogramerima i „malo manje spretnim programerima“.<strong> App Inventor for Android</strong>, kako je njegov naziv, pokazao se sasvim prikladnim za stvaranje elementarne Android aplikacije (nešto slično klasičnom Hello World primjeru), a danas ćemo probati prikazati da je upotrebljiv za bitno složenije projekte.</p>
<p><span id="more-283"></span></p>
<p>Odgovorimo prvo na nekoliko najvažnijih pitanja povezanih s korištenjem alata na razvoju složenijih projekata. Najvažnije pitanje koje se nameće samo po sebi je potencijalna složenost dovršene aplikacije. Tu odmah treba biti izravan te reći da se pomoć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 &#8211; može se. Osim brojnih komponenti za razvoj različitih dijelova sučelja (što smo djelomice pokazali u u prošlom uvodnom tekstu o alatu), na raspolaganju su najvažnije programske strukture poput <strong>foreach</strong>, <strong>while</strong>, <strong>if-else</strong> (iako u nešto slikovitijem obliku nego je to uobičajeno u programskim jezicima), a moguća je i komunikacija s web servisima te svojevrsnim spremištem podataka. Od važnijih tehnologija karakterističnih za mobilne uređaje današnjice, trenutno nije podržan samo Bluetooth, ali se prema tvrdnjama proizvođača intenzivno radi i na tom segmentu.</p>
<div id="attachment_285" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika015.jpg"><img class="size-thumbnail wp-image-285" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika015-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Basic komponente: Predstavljaju osnovne grafičke elemente aplikacije.</p></div>
<p>Ako vam slučajno ni sve nabrojano nije dovoljno za izradu vlastite aplikacije, onda alat 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 neminovno postavlja pitanje zašto ne bi sve skupa ipak programirali u standardnom SDK razvojnom 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 vlastite aplikacije angažirate Java programera da vam pomogne.</p>
<p>Trenutno dva najveća nedostatka alata odnose se na nemogućnost izravne objave aplikacije na globalnom tržištu Android aplikacija (Android Market), te ograničenost aplikacije na samo jedan prikaz (raspored kontrola). Google obećava kako će prvi problem biti uskoro riješen pa se zato njime nećemo previše baviti. Napišimo zato nekoliko riječi o drugom problemu. Na trenutnom stupnja razvoja alata ne može se izvoditi prebacivanje između više različitih vrsta prikaza ili rasporeda kontrola. To na prvi, drugi i treći pogled predstavlja zbilja veliko ograničenje u razvoju aplikacija, ali ga je ipak moguće prevazići jednim od slijedeća dva trika.</p>
<ol>
<li>Naizmjeničnim „paljenjem i      gašenjem“ kontrola, to jest izmjenom vidljivosti različitih komponenti      postavljenih na jedini dostupni prikaz kontrola.</li>
<li>Međusobnim višestrukim povezivanjem      više App Inventor for Android aplikacija, od kojih svaka može imati      različite rasporede kontrola na osnovnom zaslonu. Kad su prije koje      desetljeće nešto slično mogli raditi autori složenih igara na strojevima      poput ZX Spectruma ili Commodorea 64 te kasetofonom kao uređajem vanjske      memorije, nema nikakvog razloga zašto se to ne bi moglo napraviti i danas      sa znatno modernijim hardverom.</li>
</ol>
<div id="attachment_286" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika023.jpg"><img class="size-thumbnail wp-image-286" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika023-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Media komponente: Komponente za upravljanje različitim multimedijalnim dijelovima mobilnog uređaja.</p></div>
<p>Iako slijedeća vijest nema nikakve veze s prethodnom točkom, današnjim tekstom, pa čak ni cijelim serijalom u cjelini, ipak ću je spomenuti na ovom mjestu, ako je do sada već niste sami negdje pročitali. Kultni Commodore 64 je prije kratkog vremena dož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 u petom mjesecu. Morao sam to jednostavno spomenuti – prve ljubavi se teško zaboravljaju, makar to bila i računala.</p>
<p>Vratimo se sada ponovo današnjoj temi. Ključne dijelove aplikacije možemo podijeliti u dvije velike skupine:</p>
<ol>
<li>Komponente ili kontrole</li>
<li>Blokove</li>
</ol>
<p>Komponente su osnovni grafički dijelovi aplikacije, a međusobno se osim po izgledu razlikuju prije svega po svojoj namjeni. Osnovna grupa komponenti pod nazivom <strong>Basic</strong> obuhvaća zbilja osnovne komponente karakteristične za moderna korisnička sučelja poput gumbi, oznaka i slika. Ako ste ikad probali napisati bilo kakvu aplikaciju u nekom modernijem razvojnom alatu, trebali bi znati o čemu je riječ, pa se zato i nećemo previše baviti njihovim karakteristika. U istoj grupi kontrola nalaze se još dvije složenije kontrole, a one ipak zahtijevaju poneku dodatnu riječ. To su <strong>Canvas</strong> i <strong>TinyDB</strong>.</p>
<div id="attachment_287" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika031.jpg"><img class="size-thumbnail wp-image-287" title="Slika03" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika031-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Animation komponente: Preduvjet za njihovo korištenje je postojanje komponente Canvas.</p></div>
<p>Kontrola Canvas zamišljena je kao dvodimenzionalno područje za crtanje likova pomoću programskog koda, odnosno za pomicanje sličica („sprites“). Budući da je to isto područje osjetljivo na dodir, sasvim je razumljivo da predstavlja temeljni dio većine različitih igara razvijenih u ovom alatu. Svaka od lokacija na komponenti Canvas označava se uobičajenim matematičkim zapisom za dvodimenzionalne površine – kao koordinate x i y. O važnosti navedene kontrole u razvoju aplikacija najbolje 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.</p>
<p>Neka od tipičnih svojstava i metoda Canvas kontrole, čija imena govore sama za sebe su:</p>
<p><strong>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).</strong></p>
<p>Tijekom pisanja igara kontrola Canvas se vrlo često upotrebljava u kombinaciji s kontrolom <strong>Clock</strong> 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 biti nacrtana na osnovnoj formi kako bi se mogle koristiti njezine mogućnosti.</p>
<p>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štenih kontrola te se ponovo puni inicijalnim vrijednostima kod slijedećeg pokretanja aplikacije. 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, postavke aplikacije, stanje bodova u privremeno prekinutoj igri i slično). Upravo za takvu namjenu zamišljena je kontrola TinyDB, odnosno njezine dvije jedine dostupne metode:</p>
<p><strong>StoreValue(oznaka, vrijednost)</strong></p>
<p>Sprema vrijednost (niz znakova ili popis) pod određenim nazivom u spremište na mobilnom uređaju.</p>
<p><strong>GetValue(oznaka)</strong></p>
<p>Čita vrijednost sa zadanim nazivom iz spremišta. U slučaju da tražena oznaka ne postoji u spremištu (npr. kod prvog pokušaja čitanja vrijednosti na novom uređaju), onda metoda vraća prazan niz znakova.</p>
<p>U slučaju da treba obrisati spremište od starih vrijednosti, onda se to izvodi na telefonu standardnom naredbom Settings → Applications → Manage Applications.</p>
<p>U grupi kontrola pod nazivom <strong>Media </strong>nalazi se 5 komponenti  slijedećih naziva: <strong>Camera, ImagePicker, Player, Sound</strong> i <strong>VideoPlayer</strong>. Svaka od kontrola zadužena je za upravljanje odgovarajućim hardverskim ili softverskim resursom, pa su u skladu s tim i dodijeljeni nazivi svojstava odnosno metoda (npr. <strong>TakePicture</strong> ili <strong>AfterPicture</strong> za kontrolu Camera, odnosno <strong>Start, Stop</strong> ili Pause za kontrolu <strong>Player</strong>).</p>
<p>Grupa kontrola <strong>Animation</strong> te njezine dvije jedine komponente <strong>Ball</strong> odnosno <strong>ImageSprite</strong>, koriste se u kombinaciji s prije spomenutom kontrolom <strong>Canvas</strong> za aplikacije u kojima je potrebno izvoditi različite vrste pokretanja grafičkih objekata (dakle najčešće igre). Na priloženoj slici uz tekst vidi se da je preduvjet za korištenje kontroli iz ove grupe upravo postojanje kontrole Canvas. Pomoću svojstava kontrola poput <strong>Interval</strong>, <strong>Speed</strong> ili <strong>Rotates</strong> 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 <strong>Canvas</strong> kontrola, nema nikakvog razloga da njihovim inteligentnim paljenjem i gašenjem na jednom jedinom zaslonu (prije istaknuto ograničenje trenutne verzije razvojnog alata) napravite prilično kompleksnu igru.</p>
<div id="attachment_288" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika041.jpg"><img class="size-thumbnail wp-image-288" title="Slika04" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika041-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Social komponente: Zadužene su za pristup i korištenje različitih socijalnih podataka iz mobilnog uređaja.</p></div>
<p>Posljednja grupa kontrola koju ćemo spomenuti u današnjem nastavku su kontrole iz grupe <strong>Social</strong> zadužene za pristup i korištenje različitih socijalnih podataka iz mobilnog uređaja (<strong>ContactPicker, EmailPicker, PhoneCall, PhoneNumberPicker, Texting</strong> i <strong>Twitter</strong>). 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 metoda poput <strong>DirectMessage</strong>, <strong>RequestDirectMessage</strong> ili <strong>RequestFriendTimeLine</strong>).</p>
<p>U slijedećem nastavku napravit ćemo pregled preostalih dostupnih kontrola, a onda napraviti nekoliko složenijih primjera, koji bi trebali prikazati kako ovim alatom doista nije problem brzo napraviti i znatno složenije aplikacije.</p>
<p>Piše: Nenad Crnko</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-13-alternativni-pristup-razvoju-aplikacija-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #12: Alternativni pristup razvoju aplikacija</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-12-alternativni-pristup-razvoju-aplikacija/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-12-alternativni-pristup-razvoju-aplikacija/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 16:20:57 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=269</guid>
		<description><![CDATA[U prethodnih desetak (i još malo više) nastavaka serijala o Android programiranju pokazali 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 razvoja standardnih dijelova složenijih aplikacija. U međuvremenu se uređaji bazirani na Androidu (telefoni, ali i „tabletići“ te drugi <a href="http://android.vidilab.com/2011/10/android-programiranje-12-alternativni-pristup-razvoju-aplikacija/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>U prethodnih desetak (i još malo više) nastavaka serijala o Android programiranju pokazali 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 razvoja standardnih dijelova složenijih aplikacija. U međuvremenu se uređaji bazirani na Androidu (telefoni, ali i „tabletići“ te drugi mobilni uređaji) sve bolje prodaju širom svijeta, tako da razvoj aplikacija za ovu platformu sigurno neće biti uzaludan napor.</p>
<p><span id="more-269"></span></p>
<p>Iako ćemo se u slijedećih nekoliko nastavaka serijala pozabaviti s još nekoliko naprednijih programerskih tehnika, ovaj put ćemo se malo detaljnije osvrnuti na alernativni (čitaj bitno jednostavniji) način za razvoj aplikacija, također nastao u radionicama istog proizvođača. Na kraju krajeva među čitateljima časopisa sigurno ima onih s vrlo dobrim idejama za razvoj novih aplikacija, ali im se korištenje Google SDK alata ipak čini malo prekompliciranim. Srećom, Googleovi inženjeri intenzivno rade na nešto drugačijem pristupu čitavoj stvari, pa ćemo vas u današnjem nastavku upoznati s njihovim najnovim uradkom za tu namjenu.</p>
<p><strong>App Inventor for Android</strong> je naziv za alat namijenjen malo manje spretnim programerima dizajniranim tako da omogućava vizualno orijentirani razvoj različitih Android 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.</p>
<p>Iako u trenutku pisanja teksta (prema tvrdnjama iz samog Googlea) alat još uvijek ne podržava sve što je zamišljeno (još uvijek se nalazi u beta fazi razvoja) već sada se pomoću njega mogu napraviti zanimljive i korisne aplikacije. Googleovi inženjeri naglašavaju kako se trenutni problemi prije svega odnose na područja instalacije upravljačkih uređaja, prijenosa dijelova razvojnog alata Java na računalo te distribuciju same aplikacije na odredišni mobilni uređaj, odnosno postavljanje različitih postavki korištenja aplikacije na tom uređaju. Zato se u trenutnoj fazi razvoja alata od zainteresiranih korisnika traži da pripreme što detaljnije povratne informacije o korištenju alata, kako bi se što prije prevladali svi uočeni problemi.</p>
<div id="attachment_270" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika012.jpg"><img class="size-thumbnail wp-image-270" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika012-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Priprema računala za razvoj: Mogu se koristiti različite kombinacije operativnih sustava i preglednika. </p></div>
<p>Razvoj vlastitih aplikacija u alatu App Inventor for Android započinje pripremom vlastitog računala za takav zadatak. Za razliku od Microsofta ili Applea poznatih po ograničavaju razvoja na vlastiti hardver i/ili softver, Googleov razvojni tim kontinuirano podržava sve najpopularnije platforme (Windows, Mac i Linux). Zato nije ni čudo da se Android polako, ali sigurno, probija prema samom vrhu popularnosti na području mobilnih platformi. Nastavak teksta, te prije svega prateće slike) podrazumijevaju razvoj vlastitih aplikacija u Google Chrome pregledniku na Windows računalu, ali iz prije navedenih razloga ne bi trebali imati previše problema ni u razvoju aplikacija na nekoj drugoj konfiguraciji.</p>
<p>Prvi korak u pripremi računala je preuzimanje odgovarajućeg programa za upravljanje pripremom razvojne konfiguracije. Ovaj program može se slobodno preuzeti usmjeravanjem preglednika na web adresu <a href="http://appinventor.googlelabs.com/learn/setup/setupwindows.html">http://appinventor.googlelabs.com/learn/setup/setupwindows.html</a></p>
<p>Nakon preuzimanja instalacijskog programa treba ga instalirati na računalo te podesiti 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šavanja na 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.</p>
<div id="attachment_272" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika022.jpg"><img class="size-thumbnail wp-image-272" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika022-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Početak rada na aplikaciji: Započinje stvaranjem projekta – u ovom slučaju HelloPurr. </p></div>
<p><strong> </strong></p>
<p><strong>Izrada prve aplikacije</strong></p>
<p>U nastavku teksta opisat ćemo izradu prve aplikacije prema Googlevoj pratećoj dokumentaciji. Za razliku od uobičajenog Hello World primjera koji samo prikazuje dvije riječi na zaslonu, Googleov početni primjer odmah koristi i audio/video podatke, to jest prikazuje sliku te reproducira zvuk. Zato kao početni korak u izradi aplikacije treba skinuti jednu sliku u <strong>.png</strong> formatu, odnosno jednu zvučnu datoteku u <strong>.mp3 </strong> 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“.</p>
<p>Razvojni alat pokrećete postavljanjem preglednika na adresu <a href="http://appinventor.googlelabs.com/">http://appinventor.googlelabs.com</a>. Da bi se moglo prijeći na razvoj same aplikacije potrebno je da korisnik ima odgovarajući google email korisnički račun. Ako ga još nemate, ovo je prilika da ga stvorite. Kad obavite tu formalnost, pojavljuje se stranica namijenjena pripremi novih aplikacija, odnosno administriranju postojećih. Budući da pripremate svoj prvi projekt, izaberite opciju <strong>New</strong> na vrhu stranice te upišite naziv aplikacije <strong>HelloPur</strong>.</p>
<div id="attachment_273" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika03.jpg"><img class="size-thumbnail wp-image-273" title="Slika03" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika03-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Razvojna okolina: Vrlo je jednostavna i namijenjena korisnicima koji nisu profesionalni programeri.</p></div>
<p>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.</p>
<p>U lijevom dijelu stranice nalaze se različite grupe kontrola namijenjene iskorištavanju brojnih mogućnosti Android sustava. Tijekom razvoja prve aplikacije bit će nam potrebne svega dvije kontrole: <strong>Button</strong> i <strong>Label</strong>. Jednostavnom operacijom povlačenja postavite in na središnji dio stranice namijenjen simuliranju zaslona mobilnog uređaja. Kontrole postavite jednu ispod druge, a onda je preostalo da im izmijenite nekoliko svojstva, kako bi dobili izgled sučelja prikazan na jednoj od pratećih slika uz tekst. Kontroli <strong>Button</strong> potrebno je obrisati početni tekst prikazan na kontroli (svojstvo <strong>Text</strong>) te učitati prije spomenutu sliku kitty.png  (svojstvo <strong>Image</strong>). Kontroli <strong>Label</strong> potrebno je postaviti boju pozadine na plavu (svojstvo <strong>BackgroundColor</strong>), povećati veličinu pisma na 30 (svojstvo <strong>FontSize</strong>), 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 <strong>Properties</strong> na desnoj strani osnovne stranice.</p>
<div id="attachment_274" class="wp-caption alignright" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika04.jpg"><img class="size-thumbnail wp-image-274" title="Slika04" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika04-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Postavljanje prve kontrole: Izvodi se običnim povlačenjem kontrole na centralni dio koji predstavlja zaslon mobilnog uređaja. </p></div>
<p><span style="text-decoration: underline;"> </span></p>
<p>Na ovom stupnju razvoja aplikacije u nju je dodana slika, ali još uvijek ne i zvučni zapis. Zato je potrebno u aplikaciju povući još jednu kontrolu (<strong>Sound</strong> iz grupe <strong>Media</strong>), a onda pomoću gumba na dnu stranice dodati prije spomenutu <strong>mp3</strong> datoteku (<strong>meow.mp3</strong>). Ovim potezom sučelje je u potpunosti dovrš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čkice izazvalo njezino glasanje, to jest reprodukcija mpr datoteke, potrebno je ipak „napisati mali program“. Prethodnu tvrdnju smo stavili u znake navoda, jer je za razliku od drugih vizualno orijentiranih sučelja, koja u konačnici ipak zahtijevaju prilično znanje programiranja, Google ovdje stvarno napravio korak naprijed.</p>
<p>Na vrhu osnovne stranice potrebno je kliknuti na opciju <strong>Open the Block Eidtor</strong>, a ako ste to napravili prvi put, pričekati određeno vrijema kako bi se na vaše računalo instalirala dodatna komponenta za „pisanje programskog koda“. Evo ponovno navodnika, a konačno i objašnjenja  zašto. Kad se otvori popis svih dostupnih događaja, oni su prikazati u obliku svojevrsne slagalice. Potrebni događaj u kontekstu nekog dijela aplikacije potrebno je jednostavno „spariti“ s pravom operacijom, što se izvodi običnom operacijom povlačenja. U konkretnom slučaju potrebno je događaj <strong>Button1.Click</strong> povezati s operacijom<strong> Sound1.Play</strong> i to je to. Koliko to efektno izgleda možete provjeriti na priloženoj slici ili isprobati sami. Bravo Google!</p>
<div id="attachment_275" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika05.jpg"><img class="size-thumbnail wp-image-275" title="Slika05" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika05-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Prozor Properties: Koristi se za izmjenu različitih svojstava označene kontrole.</p></div>
<p>Preostalo je još samo da isprobate aplikaciju na stvarnom hardverskom uređaju tijekom instalacije povezanim s razvojnim alatom, ili na odgovarajućem softverskom emulatoru. Na kraju je pomoću operacije <strong>Package for Phone</strong> moguće napraviti i distribucijski oblik aplikacije.</p>
<p style="text-align: left;">Priznajte da nije bilo komplicirano, iako nismo baš detaljno opisivali način promjene svojstava. Ipak bi ovaj tekst trebali pratiti čitatelji s bar početnim poznavanjem programiranja, tako da ne bi trebao biti problem izvesti tako elementarne operacije u dizajnu aplikacije.</p>
<p style="text-align: left;">
<p style="text-align: left;">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 malo vježbe.</p>
<p style="text-align: left;">Piše: Nenad Crnko</p>
<p style="text-align: left;">
<div id="attachment_277" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika07.jpg"><img class="size-thumbnail wp-image-277" title="Slika07" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika07-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Dodavanje programskog koda: Zaista se izvodi na vizualno efektan način. </p></div>
<div id="attachment_281" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika08.jpg"><img class="size-thumbnail wp-image-281" title="Slika08" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika08-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Izvođenje programa: Osim na samom uređaju, moguće je i u odgovarajućem emulatoru. </p></div>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-12-alternativni-pristup-razvoju-aplikacija/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #11: Standardni dijelovi aplikacije</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-11-standardni-dijelovi-aplikacije/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-11-standardni-dijelovi-aplikacije/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 15:38:57 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=265</guid>
		<description><![CDATA[Na kraju teksta u prethodnom broju časopisa naveden je malo veći segment programskog koda za izvođenje nekoliko bitnih stvari u programu, ali jednostavno nije bilo dovoljno mjesta za njegovo detaljnije objašnjenje. Zato u današnjem nastavku slijedi malo detaljnija rasprava o korištenim objektima i metodama  u  tom dijelu aplikacije. Razjasnimo prvo namjenu izdvojenog dijela programskog koda <a href="http://android.vidilab.com/2011/10/android-programiranje-11-standardni-dijelovi-aplikacije/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Na kraju teksta u prethodnom broju časopisa naveden je malo veći segment programskog koda za izvođenje nekoliko bitnih stvari u programu, ali jednostavno nije bilo dovoljno mjesta za njegovo detaljnije objašnjenje. Zato u današnjem nastavku slijedi malo detaljnija rasprava o korištenim objektima i metodama  u  tom dijelu aplikacije.</p>
<p><span id="more-265"></span></p>
<p>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 zdravstveno stanje) 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 za izvođ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žio vrijeme 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 poduzimanje različ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 i slič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“ po Android mobitelu, jer je on najverojatnije negdje pri ruci. Ostaje još samo odgovor na 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že zabilježiti samo trenutak nezgode.</p>
<div id="attachment_266" class="wp-caption alignleft" style="width: 310px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika011.jpg"><img class="size-medium wp-image-266" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika011-300x187.jpg" alt="" width="300" height="187" /></a><p class="wp-caption-text">LocationManager: Vrlo složen objekt na Android platformi zadužen za dobijanje točne geografske lokacije.</p></div>
<p>Prvi dio programskog koda je najjednostavniji za objašnjavanje jer služi za obično određivanje točnog vremena nakon pritiska korisnika na odgovarajući gumb aplikacije.  To vrijeme se trajno pamti kako bi ga spasitelji mogli naknadno očitati. Ovaj segment programskog koda „zamotan“ je u standardnu rutinu za obradu pogreške, u slučaju da se dogodi nekakav problem tijekom izvođenja aplikacije.</p>
<p>public void btnPosaljiSMSClick(View view)</p>
<p>{</p>
<p>final Button btnPosaljiSMS = (Button) findViewById(R.id.btnPosaljiSMS);</p>
<p>Calendar Kalendar = Calendar.getInstance ();</p>
<p>CharSequence mTrenutnoVrijeme = Kalendar.getTime().toString();</p>
<p>mGodina = Kalendar.get(Calendar.YEAR);</p>
<p>mMjesec = Kalendar.get(Calendar.MONTH);</p>
<p>mDan = Kalendar.get(Calendar.DAY_OF_MONTH);</p>
<p>mSati = Kalendar.get(Calendar.HOUR_OF_DAY);</p>
<p>mMinute = Kalendar.get(Calendar.MINUTE);</p>
<p>mSekunde = Kalendar.get(Calendar.SECOND );</p>
<p>mTrenutnoVrijeme = Integer.toString(mDan) + &#8220;.&#8221; +</p>
<p>Integer.toString(mMjesec) + &#8220;.&#8221; +</p>
<p>Integer.toString(mGodina) + &#8221; &#8221; +</p>
<p>Integer.toString(mSati) + &#8220;:&#8221; +</p>
<p>Integer.toString(mMinute) + &#8220;:&#8221; +</p>
<p>Integer.toString(mSekunde);</p>
<p>setContentView(R.layout.critical3);</p>
<p>try {</p>
<p>VratiPodatkeCritical3();</p>
<p>} catch (IOException e1) {</p>
<p>e1.printStackTrace();</p>
<p>}</p>
<p>final CheckBox tp = (CheckBox) findViewById(R.id.chkGPSPozicija);</p>
<p>Da bi SMS poruka koja se šalje na unaprijed definirani telefonski broj bila što korisnija, ideja je da njezin dio bude točna geografska lokacija s koje je poruka poslana, kako bi se što brže i jednostavnije došlo do unesrećenog korisnika aplikacije. 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 <strong>LocationManager</strong> za dobijanje potrebnog geolokacijskog podatka.</p>
<p>String pozicija = &#8220;&#8221;;</p>
<p>if (tp.isChecked())</p>
<p>{</p>
<p>try</p>
<p>{</p>
<p>LocationManager locationManager;</p>
<p>String context = Context.LOCATION_SERVICE;</p>
<p>locationManager = (LocationManager)getSystemService(context);</p>
<p>String provider = LocationManager.GPS_PROVIDER;</p>
<p>Location location = locationManager.getLastKnownLocation(provider);</p>
<p>double lat = location.getLatitude();</p>
<p>double lng = location.getLongitude();</p>
<p>pozicija = &#8221; &#8221; + Double.toString(lat) + &#8221; / &#8221; + Double.toString(lat);</p>
<p>}</p>
<p>catch (Exception  e)</p>
<p>{</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>Prethodne naredbe sadrže još nekoliko naredbi za formatiranje podataka o geografskoj lokaciji, kako bi  podaci u okviru poruke bili prikazani na što čitljiviji podaci razumljiv spasiteljima. Kao i obično, bitno je da takv dio aplikacije podložan pogreškama bude obuhvaćen u strukturu za obradu pogrešaka. Zahtijevani podatak može u nekom trenutku jednostavno biti nedostupan.  Na primjer, izvor GPS podataka je uništen solarnom bakljom. Dobro – malo se šalimo, mnogo je vjerojatniji neki drugi uzrok problema, iako prema najavama nekih stručnjaka 2012 godine to možda uopće više neće biti samo šala.</p>
<p>LocationManager je vrlo složen objekt na Android platformi pa njegovo detaljno opisivanje prelazi okvire ovog teksta. Osnovni primjer prikazan u prethodnom dijelu programskog koda, trebao bi vam poslužiti kao vodič za dodatno istraživanje pratećih uputa o Android SDK sustavu.</p>
<p>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 nisu pripremljena, onda se korisniku aplikacije javlja odgovarajuća poruka kako bi se riješio problem. Za to se koristi funkcija o čijoj smo namjeni i djelovanju raspravljali u jednom od prethodnih nastavaka serijala.</p>
<p>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četnim podacima 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 uz mjesečnu ratu od svega 500 kn, ali uz učešće od 30 posto i ostatak vrijednosti od 30 posto – 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 ili ne želi napraviti. Rješenje problema je vrlo jednostavno. Nakon upisivanja svih potrebnih podataka u aplikaciju na samom početku njezina korištenja, treba poslati probnu poruku te provjeriti je li zaista sve u redu.</p>
<p>try</p>
<p>{</p>
<p>final EditText tmp = (EditText) findViewById(R.id.txtSMSPoruka);</p>
<p>String tmps = tmp.getText().toString();</p>
<p>if (tmps.length() == 0)</p>
<p>{</p>
<p>setContentView(R.layout.main);</p>
<p>MsgBox(&#8220;Nije definiran tekst SMS poruke!&#8221;, &#8220;Upozorenje&#8221;);</p>
<p>return;</p>
<p>}</p>
<p>final EditText tmpbr = (EditText) findViewById(R.id.txtSMSBroj);</p>
<p>String tmpsbr = tmpbr.getText().toString();</p>
<p>if (tmpsbr.length() == 0)</p>
<p>{</p>
<p>setContentView(R.layout.main);</p>
<p>MsgBox(&#8220;Nije definiran broj za slanje SMS poruke!&#8221;, &#8220;Upozorenje&#8221;);</p>
<p>return;</p>
<p>}</p>
<p>setContentView(R.layout.main);</p>
<p>VratiPodatkeMain();</p>
<p>tmps = tmps + pozicija;</p>
<p>SmsManager sm = SmsManager.getDefault();</p>
<p>sm.sendTextMessage(tmpsbr, null, tmps + pozicija, null, null);</p>
<p>}</p>
<p>catch (Exception  e)</p>
<p>{</p>
<p>MsgBox(e.getMessage(),&#8221;Greška&#8221;);</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();</p>
<p>CharSequence poruka = &#8220;Zabilježeno vrijeme slanja SMS poruke za pomoć\n\n&#8221; ;</p>
<p>poruka = poruka + mTrenutnoVrijeme.toString();</p>
<p>ad.setTitle(&#8220;Potvrda operacije&#8221;);</p>
<p>ad.setMessage(poruka);</p>
<p>ad.setButton(&#8220;Zatvori&#8221;, new DialogInterface.OnClickListener()</p>
<p>{</p>
<p>@Override</p>
<p>public void onClick(DialogInterface arg0, int arg1)</p>
<p>{</p>
<p>}</p>
<p>});</p>
<p>ad.show();</p>
<p>Na kraju cijelog postupka prikazuje se točno vrijeme slanja poruke. Ne treba posebno 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.</p>
<p>btnPosaljiSMS.setText(&#8220;SMS poruka: &#8221; + mTrenutnoVrijeme);</p>
<p>try {</p>
<p>SpremiPodatkeMain();</p>
<p>} catch (IOException e) {</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>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 demonstracija korištenja nekoliko bitnih tehnika kao što je dobro poznati Google Maps, preuzimanje podataka s ugrađenih senzora, korištenje dodatnih grafičkih i zvučnih mogućnosti te još poneka zanimljivih sitnica. Ostalo je još dosta zanimljivog materijala za slijedećih nekoliko nastavaka, posebno ako sve te dijelove uz dodatak već obrađenih želimo kreativno povezati u prave aplikacije.</p>
<div id="attachment_267" class="wp-caption alignright" style="width: 310px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika021.jpg"><img class="size-medium wp-image-267" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika021-300x187.jpg" alt="" width="300" height="187" /></a><p class="wp-caption-text">LocationManager: Vrlo složen objekt na Android platformi zadužen za dobijanje točne geografske lokacije.</p></div>
<p>Budući da smo u zadnjih nekoliko brojeva „vadili“ dijelove programskog koda iz relativno složene aplikacije, nismo na pratećem digitalnom mediju objavljivali dijelove projekta. Od slijedećeg puta ponovo se vraćamo na staru dobru praksu korištenja pratećeg medija uz časopi, kako se ne bi trebali sami mučiti s prekucavanjem manjih ili većih dijelova programskog koda u korisničko sučelje vlastitog računala.</p>
<p>Piše: Nenad Crnko</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-11-standardni-dijelovi-aplikacije/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #10: Nekoliko standardnih dijelova aplikacije</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-10-nekoliko-standardnih-dijelova-aplikacije/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-10-nekoliko-standardnih-dijelova-aplikacije/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 15:33:47 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=261</guid>
		<description><![CDATA[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će promjene možete upotrijebiti u vlastitim projektima. Prvo jedan sasvim logičan, <a href="http://android.vidilab.com/2011/10/android-programiranje-10-nekoliko-standardnih-dijelova-aplikacije/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>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će promjene možete upotrijebiti u vlastitim projektima.</p>
<p><span id="more-261"></span></p>
<p>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 ovom primjeru), zahtijeva uključivanje odgovarajućih biblioteka. Ovisno o načinu oblikovanja 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 aplikaciji odjednom pojavi čitav niz pogrešaka, postoji dosta velika vjerojatnost da nedostaje (zbog izostanka ili slučajnog brisanja) odgovarajuća <strong>import</strong> naredba. U nastavku slijedi prikaz kako to prilično komplicirano izgleda u ovom slučaju:</p>
<div id="attachment_262" class="wp-caption alignleft" style="width: 310px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika01.jpg"><img class="size-medium wp-image-262" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika01-300x187.jpg" alt="" width="300" height="187" /></a><p class="wp-caption-text">Primjer rasporeda kontrola: Jedan od standardnih dijelova aplikacije za prikupljanje podataka o korisniku.</p></div>
<p>import java.io.BufferedReader;</p>
<p>import java.io.FileInputStream;</p>
<p>import java.io.FileNotFoundException;</p>
<p>import java.io.FileOutputStream;</p>
<p>import java.io.IOException;</p>
<p>import java.io.InputStreamReader;</p>
<p>import java.io.OutputStream;</p>
<p>import java.sql.Date;</p>
<p>import java.text.DateFormat;</p>
<p>import java.util.Calendar;</p>
<p>import android.R.bool;</p>
<p>import android.R.integer;</p>
<p>import android.R.string;</p>
<p>import android.app.Activity;</p>
<p>import android.app.AlertDialog;</p>
<p>import android.app.PendingIntent;</p>
<p>import android.content.Context;</p>
<p>import android.content.DialogInterface;</p>
<p>import android.content.Intent;</p>
<p>import android.content.res.ColorStateList;</p>
<p>import android.location.Location;</p>
<p>import android.location.LocationManager;</p>
<p>import android.os.Bundle;</p>
<p>import android.os.Message;</p>
<p>import android.os.Messenger;</p>
<p>import android.telephony.SmsManager;</p>
<p>import android.text.TextUtils;</p>
<p>import android.view.View;</p>
<p>import android.view.ViewGroup;</p>
<p>import android.view.ViewGroup.LayoutParams;</p>
<p>import android.widget.Button;</p>
<p>import android.widget.CheckBox;</p>
<p>import android.widget.CheckedTextView;</p>
<p>import android.widget.EditText;</p>
<p>U medicinski orijentiranoj aplikaciji čije dijelove koristimo za demonstraciju programskog koda, zbog relativno velike količine prikupljenih podataka o korisniku aplikacije neprikladne za prikaz na samo jednom zaslonu ograničene rezolucije (uobičajene kod mobilnih telefona opremljenih Android sustavom), koristi se više međusobno povezanih rasporeda kontrola, a na svakom od rasporeda upotrijebljene su različite kontrole kako bi se što jednostavnije i preglednije unijeli relevantni podaci. Kako to zaista izgleda na zaslonu Android uređaja možete provjeriti na temelju priloženih slika uz tekst, a dijelovi odgovarajućeg XML koda navedeni su u nastavku.</p>
<p>&#8230;</p>
<p>&lt;AbsoluteLayout android:id=&#8221;@+id/AbsoluteLayout01&#8243; android:layout_width=&#8221;fill_parent&#8221; android:layout_height=&#8221;fill_parent&#8221; xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;&gt;</p>
<p>&lt;Button android:layout_width=&#8221;wrap_content&#8221; android:layout_height=&#8221;wrap_content&#8221; android:layout_x=&#8221;0px&#8221; android:layout_y=&#8221;0px&#8221; android:id=&#8221;@+id/btn2VratiSe&#8221; android:onClick=&#8221;btn2VratiSeClick&#8221; android:text=&#8221;&amp;lt;&amp;lt;  Natrag&#8221;&gt;&lt;/Button&gt;</p>
<p>&lt;Button android:layout_width=&#8221;wrap_content&#8221; android:layout_height=&#8221;wrap_content&#8221; android:layout_y=&#8221;0px&#8221; android:text=&#8221;Poništi nezgodu&#8221; android:minWidth=&#8221;150px&#8221; android:layout_x=&#8221;90px&#8221; android:onClick=&#8221;btn2PonistiNezgoduClick&#8221; android:id=&#8221;@+id/btn2PonistiNezgodu&#8221;&gt;&lt;/Button&gt;</p>
<p>&#8230;</p>
<p>&lt;TextView android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;wrap_content&#8221;</p>
<p>android:text=&#8221;Prezime i ime:&#8221; android:id=&#8221;@+id/txtvPrezimeIme&#8221; android:layout_y=&#8221;50px&#8221; android:layout_x=&#8221;2px&#8221;&gt;&lt;/TextView&gt;</p>
<p>&lt;EditText android:saveEnabled=&#8221;false&#8221; android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;fill_parent&#8221;</p>
<p>android:layout_x=&#8221;0px&#8221; android:id=&#8221;@+id/txtPrezimeIme&#8221; android:singleLine=&#8221;true&#8221; android:layout_y=&#8221;65px&#8221;&gt;&lt;/EditText&gt;</p>
<p>&#8230;</p>
<p>&lt;AbsoluteLayout android:id=&#8221;@+id/AbsoluteLayout01&#8243; android:layout_width=&#8221;fill_parent&#8221; android:layout_height=&#8221;fill_parent&#8221; xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;&gt;</p>
<p>&lt;EditText android:saveEnabled=&#8221;false&#8221; android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;wrap_content&#8221; android:singleLine=&#8221;true&#8221; android:layout_y=&#8221;65px&#8221; android:id=&#8221;@+id/txtKrvnaGrupa&#8221; android:maxLength=&#8221;2&#8243; android:text=&#8221;__&#8221; android:layout_x=&#8221;170px&#8221; android:maxWidth=&#8221;50px&#8221; android:minWidth=&#8221;50px&#8221;&gt;</p>
<p>&#8230;</p>
<p>&lt;CheckBox android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;wrap_content&#8221; android:id=&#8221;@+id/chkSida&#8221; android:layout_x=&#8221;0px&#8221; android:text=&#8221;Sida&#8221; android:layout_y=&#8221;120px&#8221;&gt;&lt;/CheckBox&gt;</p>
<p>&lt;CheckBox android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;wrap_content&#8221; android:layout_x=&#8221;85px&#8221; android:layout_y=&#8221;120px&#8221; android:text=&#8221;Hepatitis C&#8221; android:id=&#8221;@+id/chkHepatitisC&#8221;&gt;&lt;/CheckBox&gt;</p>
<p>&lt;CheckBox android:layout_height=&#8221;wrap_content&#8221; android:layout_width=&#8221;wrap_content&#8221; android:id=&#8221;@+id/chkDonator&#8221; android:text=&#8221;Donator&#8221; android:layout_x=&#8221;210px&#8221; android:layout_y=&#8221;120px&#8221;&gt;&lt;/CheckBox&gt;</p>
<p>U trenutku prelaska s jednog rasporeda kontrola na drugi postojeći sadržaj kontrola iz starog rasporeda kontrola sprema se za kasnije korištenje, a novi raspored kontrola se popunjava prethodno spremljenim sadržajem (ako takav postoji 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 na prvom i zadnjem). Slijedi primjer korištenja na drugom rasporedu kontrola – na njemu postoji gumb za prelazak na prvi, odnosno na treći raspored kontrola.</p>
<p>public void btn3VratiSeClick(View view)</p>
<p>{</p>
<p>try {</p>
<p>SpremiPodatkeCritical2();</p>
<p>} catch (IOException e1) {</p>
<p>e1.printStackTrace();</p>
<p>}</p>
<p>setContentView(R.layout.critical);</p>
<p>try {</p>
<p>VratiPodatkeCritical();</p>
<p>} catch (IOException e) {</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>public void btn3DaljeClick(View view)</p>
<p>{</p>
<p>try {</p>
<p>SpremiPodatkeCritical2();</p>
<p>} catch (IOException e1) {</p>
<p>e1.printStackTrace();</p>
<p>}</p>
<p>setContentView(R.layout.critical3);</p>
<p>try {</p>
<p>VratiPodatkeCritical3();</p>
<p>} catch (IOException e) {</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>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.</p>
<p>Osim prikaza podataka na standardnim rasporedima kontrola, vrlo često je u programu potrebno prikazati i odgovarajuće dijaloške okvire o statusnim informacijama, greškama u radu i slično. U nastavku je naveden primjer programskog 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).</p>
<div id="attachment_263" class="wp-caption alignright" style="width: 310px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika02.jpg"><img class="size-medium wp-image-263" title="Slika02" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika02-300x187.jpg" alt="" width="300" height="187" /></a><p class="wp-caption-text">Primjer rasporeda kontrola: Drugi standardni dio aplikacije.</p></div>
<p>public void btnPrvaPomocClick(View view)</p>
<p>{</p>
<p>AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();</p>
<p>CharSequence poruka = &#8220;Autor programa \n&#8221; ;</p>
<p>poruka = poruka + &#8220;Crnko Nenad\n\n&#8221;;</p>
<p>poruka = poruka + &#8220;Stručni medicinski suradnik\n&#8221;;</p>
<p>poruka = poruka + &#8220;Fusić Snježana\n\n&#8221;;</p>
<p>poruka = poruka + &#8220;Verzija programa\n&#8221;;</p>
<p>poruka = poruka + &#8220;25.06.2010 23:00:00&#8243;;</p>
<p>ad.setTitle(&#8220;O programu&#8230;&#8221;);</p>
<p>ad.setMessage(poruka);</p>
<p>ad.setButton(&#8220;Zatvori&#8221;, new DialogInterface.OnClickListener()</p>
<p>{</p>
<p>@Override</p>
<p>public void onClick(DialogInterface arg0, int arg1)</p>
<p>{</p>
<p>}</p>
<p>});</p>
<p>ad.show();</p>
<p>}</p>
<p>U slučaju da vam to negdje zatreba, evo i opće funkcije za otvaranje osnovnog oblika dijaloškog okvira koju uz veće ili manje preinake možete upotrijebiti u vlastitim aplikacija. Ulazni parametri funkcije su poruka koja se prikazuje u okviru dijaloškog okvira te njegovo zaglavlje.</p>
<p>private void MsgBox(String Poruka, String VrstaPoruke)</p>
<p>{</p>
<p>AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();</p>
<p>ad.setTitle(VrstaPoruke);</p>
<p>ad.setMessage(Poruka);</p>
<p>ad.setButton(&#8220;Zatvori&#8221;, new DialogInterface.OnClickListener()</p>
<p>{</p>
<p>@Override</p>
<p>public void onClick(DialogInterface arg0, int arg1)</p>
<p>{</p>
<p>}</p>
<p>});</p>
<p>ad.show();</p>
<p>}</p>
<p>Navedimo na kraju današnjeg nastavka najsloženiji „komad“ programskog koda zadužen za pripremu i slanje SMS poruke s podacima iz programa u slučaju nezgode. Zbog ograničenja prostora u časopisu ovim dijelom ćemo se nešto detaljnije pozabaviti u slijedećem nastavku serijala.</p>
<p>public void btnPosaljiSMSClick(View view)</p>
<p>{</p>
<p>final Button btnPosaljiSMS = (Button) findViewById(R.id.btnPosaljiSMS);</p>
<p>Calendar Kalendar = Calendar.getInstance ();</p>
<p>CharSequence mTrenutnoVrijeme = Kalendar.getTime().toString();</p>
<p>mGodina = Kalendar.get(Calendar.YEAR);</p>
<p>mMjesec = Kalendar.get(Calendar.MONTH);</p>
<p>mDan = Kalendar.get(Calendar.DAY_OF_MONTH);</p>
<p>mSati = Kalendar.get(Calendar.HOUR_OF_DAY);</p>
<p>mMinute = Kalendar.get(Calendar.MINUTE);</p>
<p>mSekunde = Kalendar.get(Calendar.SECOND );</p>
<p>mTrenutnoVrijeme = Integer.toString(mDan) + &#8220;.&#8221; +</p>
<p>Integer.toString(mMjesec) + &#8220;.&#8221; +</p>
<p>Integer.toString(mGodina) + &#8221; &#8221; +</p>
<p>Integer.toString(mSati) + &#8220;:&#8221; +</p>
<p>Integer.toString(mMinute) + &#8220;:&#8221; +</p>
<p>Integer.toString(mSekunde);</p>
<p>setContentView(R.layout.critical3);</p>
<p>try {</p>
<p>VratiPodatkeCritical3();</p>
<p>} catch (IOException e1) {</p>
<p>e1.printStackTrace();</p>
<p>}</p>
<p>final CheckBox tp = (CheckBox) findViewById(R.id.chkGPSPozicija);</p>
<p>String pozicija = &#8220;&#8221;;</p>
<p>if (tp.isChecked())</p>
<p>{</p>
<p>try</p>
<p>{</p>
<p>LocationManager locationManager;</p>
<p>String context = Context.LOCATION_SERVICE;</p>
<p>locationManager = (LocationManager)getSystemService(context);</p>
<p>String provider = LocationManager.GPS_PROVIDER;</p>
<p>Location location = locationManager.getLastKnownLocation(provider);</p>
<p>double lat = location.getLatitude();</p>
<p>double lng = location.getLongitude();</p>
<p>pozicija = &#8221; &#8221; + Double.toString(lat) + &#8221; / &#8221; + Double.toString(lat);</p>
<p>}</p>
<p>catch (Exception  e)</p>
<p>{</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>try</p>
<p>{</p>
<p>final EditText tmp = (EditText) findViewById(R.id.txtSMSPoruka);</p>
<p>String tmps = tmp.getText().toString();</p>
<p>if (tmps.length() == 0)</p>
<p>{</p>
<p>setContentView(R.layout.main);</p>
<p>MsgBox(&#8220;Nije definiran tekst SMS poruke!&#8221;, &#8220;Upozorenje&#8221;);</p>
<p>return;</p>
<p>}</p>
<p>final EditText tmpbr = (EditText) findViewById(R.id.txtSMSBroj);</p>
<p>String tmpsbr = tmpbr.getText().toString();</p>
<p>if (tmpsbr.length() == 0)</p>
<p>{</p>
<p>setContentView(R.layout.main);</p>
<p>MsgBox(&#8220;Nije definiran broj za slanje SMS poruke!&#8221;, &#8220;Upozorenje&#8221;);</p>
<p>return;</p>
<p>}</p>
<p>setContentView(R.layout.main);</p>
<p>VratiPodatkeMain();</p>
<p>tmps = tmps + pozicija;</p>
<p>SmsManager sm = SmsManager.getDefault();</p>
<p>sm.sendTextMessage(tmpsbr, null, tmps + pozicija, null, null);</p>
<p>}</p>
<p>catch (Exception  e)</p>
<p>{</p>
<p>MsgBox(e.getMessage(),&#8221;Greška&#8221;);</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();</p>
<p>CharSequence poruka = &#8220;Zabilježeno vrijeme slanja SMS poruke za pomoć\n\n&#8221; ;</p>
<p>poruka = poruka + mTrenutnoVrijeme.toString();</p>
<p>ad.setTitle(&#8220;Potvrda operacije&#8221;);</p>
<p>ad.setMessage(poruka);</p>
<p>ad.setButton(&#8220;Zatvori&#8221;, new DialogInterface.OnClickListener()</p>
<p>{</p>
<p>@Override</p>
<p>public void onClick(DialogInterface arg0, int arg1)</p>
<p>{</p>
<p>}</p>
<p>});</p>
<p>ad.show();</p>
<p>btnPosaljiSMS.setText(&#8220;SMS poruka: &#8221; + mTrenutnoVrijeme);</p>
<p>try {</p>
<p>SpremiPodatkeMain();</p>
<p>} catch (IOException e) {</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-10-nekoliko-standardnih-dijelova-aplikacije/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android programiranje #9: Korištenje datotečnog sustava</title>
		<link>http://android.vidilab.com/2011/10/android-programiranje-9-koristenje-datotecnog-sustava/</link>
		<comments>http://android.vidilab.com/2011/10/android-programiranje-9-koristenje-datotecnog-sustava/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 15:30:27 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Škola]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=257</guid>
		<description><![CDATA[Nakon što smo u prošlom nastavku pokazali kako se stvara osnovna vrsta izbornika, danas ćemo objasniti kako program na najednostavniji mogući način putem izbornika odgovara na akcije korisnika. Ujedno ćemo od ovomjesečnog nastavka napraviti malo „ubrzanje“ u izlaganju kako bi u planiranom broju preostalih nastavaka mogli doista i napraviti nekakvu malo složeniju aplikaciju. Ideja je <a href="http://android.vidilab.com/2011/10/android-programiranje-9-koristenje-datotecnog-sustava/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p>Nakon što smo u prošlom nastavku pokazali kako se stvara osnovna vrsta izbornika, danas ćemo objasniti kako program na najednostavniji mogući način putem izbornika odgovara na akcije korisnika. Ujedno ćemo od ovomjesečnog nastavka napraviti malo „ubrzanje“ u izlaganju kako bi u planiranom broju preostalih nastavaka mogli doista i napraviti nekakvu malo složeniju aplikaciju.<span id="more-257"></span> Ideja je da izloženu materiju prikažemo na međusobno povezani način, kako nakon prolaska kroz čitav serijal ne bi imali niz nepovezanih segmenata znanja o pojedinim dijelovima 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 imati previš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 to ili ne, lako pretvorilo u „prepisivanje“ originalnih uputa. Umjesto toga ćemo u složenijoj aplikaciji koju smo maloprije najavili pokazati brojne dodatne mogućnosti u korištenju.</p>
<p>Osnovni oblik reakcije izbornika na djelovanje korisnika priprema se u dva koraka prema slijedećem obrascu. U prvom koraku treba implementirati <strong>OnMenuClickListener </strong>sučelje. U drugom koraku, koji se izvodi nakon izbora neke od opcija od strane korisnika, poziva se metoda <strong>onMenuItemClick()</strong>. To je ujedno mjesto gdje se izvodi stvarna obrada događaja – pritiska na neku od opcija izbornika.</p>
<p>//korak1</p>
<p>public class MyResponse implements OnMenuClickListener</p>
<p>{</p>
<p>//&#8230;</p>
<p>@override</p>
<p><strong>boolean onMenuItemClick(MenuItem item)</strong></p>
<p>{</p>
<p>//izvođenje operacije</p>
<p>return true;</p>
<p>}</p>
<p>}</p>
<p>//korak 2</p>
<p>MyResponse myResponse = new MyResponse(&#8230;);</p>
<p>menuItem.setOnMenuItemClickListener(myResponse);</p>
<p>&#8230;</p>
<p>Osim osnovnog načina reakcije izbornika na događaje postoji još nekoliko varijanti koje ćemo demonstrirati na složenijoj aplikaciji. U njoj ćemo ujedno pokazati kako se izvornici mogu stvoriti preko odgovarajuće resursne XML datoteke, a ne samo programskim kodom.</p>
<p><strong>Rad s datotekama</strong></p>
<p>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 navedene dvije operacije izvode pomoću datotečnog sustava ugrađenog u Android SDK. Za to ćemo koristiti dva specijalizirana tijeka podataka – <strong>FileOutputStream</strong> i <strong>FileInputStream</strong>. Prvi se koristi za prijenos podataka na relaciji program &#8211; datoteka, a drugi u obrnutom smjeru. Ujedno ćemo pokazati dvije dodatne nužne operacije kod takvog postupka. Prva je „skupljanje“ trenutnih vrijednosti različitih Android kontrola upisanih od strane korisnika aplikacije kako bi se imalo što upisati u datoteku, a druga je njihovo ponovno vraćanje iz datoteke i postavljanje na odgovarajuću kontrolu.</p>
<p>Pogledajmo prvo kako se izvodi spremanje podataka u datoteku na segmentu programskog koda „izvađenog“ iz jedne manje medicinski orijentirane aplikacije. U ovom trenutku zapravo i nije previše bitno o kakvim se podacima radi. Primijetimo samo da se podaci ne skupljaju isključivo iz tekstualnih nego i iz drugih oblika kontrola, a prije samog spremanja u datoteku se grupiraju u jedan složeniji niz znakova. U njemu su podaci međusobno odvojeni posebnim nizom znakova za odvajanje, kako bi se olakšalo njihovo obnavljanje kod suprotne operacije čitanja iz datoteke.</p>
<div id="attachment_258" class="wp-caption alignleft" style="width: 160px"><a href="http://android.vidilab.com/wp-content/uploads/2011/10/Slika01.png"><img class="size-thumbnail wp-image-258" title="Slika01" src="http://android.vidilab.com/wp-content/uploads/2011/10/Slika01-150x150.png" alt="" width="150" height="150" /></a><p class="wp-caption-text">Spremanje podataka iz aplikacije: Prethodni primjeri koda odnose se na jednostavnu medicinski orijentiranu aplikaciju.</p></div>
<p>private void SpremiPodatkeCritical2() throws IOException</p>
<p>{</p>
<p>String FILENAME = &#8220;PrvaPomocCritical2&#8243;;</p>
<p>String string = &#8220;&#8221;;</p>
<p>FileOutputStream fos;</p>
<p>try</p>
<p>{</p>
<p>final EditText tmp = (EditText) findViewById(R.id.txtSpol);</p>
<p>String tmps = tmp.getText().toString();</p>
<p>if (tmps.length() == 0) tmps = &#8220;!!!&#8221;;</p>
<p>final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);</p>
<p>String tmps2 = tmp2.getText().toString();</p>
<p>if (tmps2.length() == 0) tmps2 = &#8220;!!!&#8221;;</p>
<p>final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);</p>
<p>String tmps3 = tmp3.getText().toString();</p>
<p>if (tmps3.length() == 0) tmps3 = &#8220;!!!&#8221;;</p>
<p>final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);</p>
<p>String tmps4 = tmp4.getText().toString();</p>
<p>if (tmps4.length() == 0) tmps4 = &#8220;!!!&#8221;;</p>
<p>final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);</p>
<p>String tmps5 = &#8220;N&#8221;;</p>
<p>if (tmp5.isChecked()) tmps5 = &#8220;D&#8221;;</p>
<p>final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);</p>
<p>String tmps6 = &#8220;N&#8221;;</p>
<p>if (tmp6.isChecked()) tmps6 = &#8220;D&#8221;;</p>
<p>final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);</p>
<p>String tmps7 = &#8220;N&#8221;;</p>
<p>if (tmp7.isChecked()) tmps7 = &#8220;D&#8221;;</p>
<p>final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);</p>
<p>String tmps8 = tmp8.getText().toString();</p>
<p>if (tmps8.length() == 0) tmps8 = &#8220;!!!&#8221;;</p>
<p>final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);</p>
<p>String tmps9 = tmp9.getText().toString();</p>
<p>if (tmps9.length() == 0) tmps9 = &#8220;!!!&#8221;;</p>
<p>final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);</p>
<p>String tmps10 = tmp10.getText().toString();</p>
<p>if (tmps10.length() == 0) tmps10 = &#8220;!!!&#8221;;</p>
<p>final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);</p>
<p>String tmps11 = tmp11.getText().toString();</p>
<p>if (tmps11.length() == 0) tmps11 = &#8220;!!!&#8221;;</p>
<p>string = tmps + &#8220;###&#8221; + tmps2 + &#8220;###&#8221; + tmps3 + &#8220;###&#8221; + tmps4 + &#8220;###&#8221; + tmps5 + &#8220;###&#8221; + tmps6 + &#8220;###&#8221; + tmps7 + &#8220;###&#8221; + tmps8 + &#8220;###&#8221; + tmps9 + &#8220;###&#8221; + tmps10 + &#8220;###&#8221; + tmps11;</p>
<p>fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);</p>
<p>fos.write(string.getBytes());</p>
<p>fos.close();</p>
<p>}</p>
<p>catch (FileNotFoundException e) {</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>Istaknimo vrlo važnu činjenicu koju svakako treba uzeti u obzir kod rada s datotečnim sustavom, a to je mogućnost pojave greške. Osnovni niz naredbi za zapis podataka u datoteku:</p>
<p>fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);</p>
<p>fos.write(string.getBytes());</p>
<p>fos.close();</p>
<p>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 se aplikacija u tom slučaju ne bi počela nekontrolirano ponašati, treba ugraditi bar osnovni mehanizam obrade pogreške u vlastitom kodu, što je ovdje i napravljeno korištenjem standardne <strong>try .. catch</strong> strukture.</p>
<p>Pogledajmo sada kako se koristi suprotni tijek podataka namijenjen čitanju spremljenih podataka.</p>
<p>private void VratiPodatkeCritical2() throws IOException</p>
<p>{</p>
<p>String FILENAME = &#8220;PrvaPomocCritical2&#8243;;</p>
<p>String string1 = &#8220;&#8221;;</p>
<p>setContentView(R.layout.critical2);</p>
<p>FileInputStream fis;</p>
<p>try</p>
<p>{</p>
<p>fis = openFileInput(FILENAME);</p>
<p>BufferedReader buf = new BufferedReader(new InputStreamReader(fis));</p>
<p>string1 = buf.readLine();</p>
<p>String[] list = TextUtils.split(string1, &#8220;###&#8221;);</p>
<p>final EditText tmp = (EditText) findViewById(R.id.txtSpol);</p>
<p>if (list[0].matches(&#8220;!!!&#8221;)) list[0] = &#8220;&#8221;;</p>
<p>tmp.setText(list[0]);</p>
<p>final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);</p>
<p>if (list[1].matches(&#8220;!!!&#8221;)) list[1] = &#8220;&#8221;;</p>
<p>tmp2.setText(list[1]);</p>
<p>final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);</p>
<p>if (list[2].matches(&#8220;!!!&#8221;)) list[2] = &#8220;&#8221;;</p>
<p>tmp3.setText(list[2]);</p>
<p>final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);</p>
<p>if (list[3].matches(&#8220;!!!&#8221;)) list[3] = &#8220;&#8221;;</p>
<p>tmp4.setText(list[3]);</p>
<p>final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);</p>
<p>tmp5.setChecked(false);</p>
<p>if (list[4].matches(&#8220;D&#8221;)) tmp5.setChecked(true);</p>
<p>final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);</p>
<p>tmp6.setChecked(false);</p>
<p>if (list[5].matches(&#8220;D&#8221;)) tmp6.setChecked(true);</p>
<p>final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);</p>
<p>tmp7.setChecked(false);</p>
<p>if (list[6].matches(&#8220;D&#8221;)) tmp7.setChecked(true);</p>
<p>final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);</p>
<p>if (list[7].matches(&#8220;!!!&#8221;)) list[7] = &#8220;&#8221;;</p>
<p>tmp8.setText(list[7]);</p>
<p>final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);</p>
<p>if (list[8].matches(&#8220;!!!&#8221;)) list[8] = &#8220;&#8221;;</p>
<p>tmp9.setText(list[8]);</p>
<p>final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);</p>
<p>if (list[9].matches(&#8220;!!!&#8221;)) list[9] = &#8220;&#8221;;</p>
<p>tmp10.setText(list[9]);</p>
<p>final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);</p>
<p>if (list[10].matches(&#8220;!!!&#8221;)) list[10] = &#8220;&#8221;;</p>
<p>tmp11.setText(list[10]);</p>
<p>fis.close();</p>
<p>}</p>
<p>catch (FileNotFoundException e)</p>
<p>{</p>
<p>final EditText tmp = (EditText) findViewById(R.id.txtSpol);</p>
<p>tmp.setText(&#8220;$_&#8221;);</p>
<p>final EditText tmp2 = (EditText) findViewById(R.id.txtTezina);</p>
<p>tmp2.setText(&#8220;___&#8221;);</p>
<p>final EditText tmp3 = (EditText) findViewById(R.id.txtKrvnaGrupa);</p>
<p>tmp3.setText(&#8220;__&#8221;);</p>
<p>final EditText tmp4 = (EditText) findViewById(R.id.txtRhFaktor);</p>
<p>tmp4.setText(&#8220;_&#8221;);</p>
<p>final CheckBox tmp5 = (CheckBox) findViewById(R.id.chkSida);</p>
<p>tmp5.setChecked(false);</p>
<p>final CheckBox tmp6 = (CheckBox) findViewById(R.id.chkHepatitisC);</p>
<p>tmp6.setChecked(false);</p>
<p>final CheckBox tmp7 = (CheckBox) findViewById(R.id.chkDonator);</p>
<p>tmp7.setChecked(true);</p>
<p>final EditText tmp8 = (EditText) findViewById(R.id.txtAlergija);</p>
<p>tmp8.setText(&#8220;$Alergija&#8221;);</p>
<p>final EditText tmp9 = (EditText) findViewById(R.id.txtDijagnoza);</p>
<p>tmp9.setText(&#8220;$Dijagnoza&#8221;);</p>
<p>final EditText tmp10 = (EditText) findViewById(R.id.txtTerapija);</p>
<p>tmp10.setText(&#8220;$Terapija&#8221;);</p>
<p>final EditText tmp11 = (EditText) findViewById(R.id.txtNapomena);</p>
<p>tmp11.setText(&#8220;$Napomena&#8221;);</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p>Ponovno, potrebna je standardna procedura za obradu pogrešaka (<strong>throws IOException</strong>), jer se može dogoditi da u datotečnom sustavu iz ovog ili onog razloga ne postoji, ili je oštećena datoteka s podacima. Budući da smo prilikom spremanja 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 u odgovarajuće polje podataka pomoću naredbe:</p>
<p>String[] list = TextUtils.split(string1, &#8220;###&#8221;);</p>
<p>Preostalo je još samo to da se na korištenom rasporedu kontrola unutar aplikacije pronađe odgovarajuća kontrola te da joj se dodijeli točno određena vrijednost pročitana iz datoteke. Za taj postupak koristi se niz <strong>findViewById</strong> naredbi.</p>
<p>Piše: Nenad Crnko</p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/10/android-programiranje-9-koristenje-datotecnog-sustava/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boeing oprema 787-ice Android OS uređajima</title>
		<link>http://android.vidilab.com/2011/09/boeing-oprema-787-ice-android-os-uredajima/</link>
		<comments>http://android.vidilab.com/2011/09/boeing-oprema-787-ice-android-os-uredajima/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 15:08:40 +0000</pubDate>
		<dc:creator>Ivan Kišić</dc:creator>
				<category><![CDATA[Novosti]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[boeing]]></category>
		<category><![CDATA[panasonic]]></category>

		<guid isPermaLink="false">http://android.vidilab.com/?p=253</guid>
		<description><![CDATA[Boeing je ovih dana objavio kako u sve svoje 787 Dreamliner zrakoplove uskoro počinje ugrađivati interaktivne touchscreen uređaje bazirane na operativnom sustavu Android. Dok će se u ekonomskoj klasi nalaziti ekrani osjetljivi na dodir ugrađeni u pozadinu sjedala, putnici prve klase će na rukohvatima svojih udobnih sjedala imati touchpadove, kako se ne bi morali pomicati <a href="http://android.vidilab.com/2011/09/boeing-oprema-787-ice-android-os-uredajima/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://android.vidilab.com/wp-content/uploads/2011/09/Boeing-oprema-787-ice-Android-OS-uredajima_VIDIClanakNaslovna.jpg"><img class="alignleft size-thumbnail wp-image-254" title="Boeing-oprema-787-ice-Android-OS-uredajima_VIDIClanakNaslovna" src="http://android.vidilab.com/wp-content/uploads/2011/09/Boeing-oprema-787-ice-Android-OS-uredajima_VIDIClanakNaslovna-150x150.jpg" alt="" width="150" height="150" /></a>Boeing je ovih dana objavio kako u sve svoje 787 Dreamliner zrakoplove uskoro počinje ugrađivati interaktivne touchscreen uređaje bazirane na operativnom sustavu Android.</p>
<p>Dok će se u ekonomskoj klasi nalaziti ekrani osjetljivi na dodir ugrađeni u pozadinu sjedala, putnici prve klase će na rukohvatima svojih udobnih sjedala imati touchpadove, kako se ne bi morali pomicati iz ležećeg položaja.</p>
<p>Posao opremanja Boeingovih zrakoplova novom opremom namijenjenoj zabavi putnika pripao je Panasonicu i Thales grupi, a Boeing kaže kako će zrakoplovne kompanije pri naručivanju njihovih 787 Dreamliner aviona moći odlučiti čije uređaje žele ugraditi.</p>
<p>Za sada još nisu poznati detalji Android OS-a koji će biti ugrađivan u interaktivne ekrane zrakoplova, no Google je potvrdio kako će koristiti Netflix, Hulu i razne glazbene servise, te imati mogućnost reprodukcije multimedijskih sadržaja s USB diskova i stickova.</p>
<p>Nedavno je objavljeno da će piloti putničkih zrakoplova uskoro koristiti iPad tablete umjesto pilotskih torbi s kartama i parametrima leta, pa će biti zanimljivo vidjeti kako će u isto vrijeme putnici uživati na interaktivnim ekranima temeljenim na Androidu.</p>
<p>Preneseno s <a title="Vidi.hr" href="http://vidi.hr/Pop-Tech/Boeing-oprema-787-ice-Android-OS-uredajima" target="_blank">www.vidi.hr</a></p>
]]></content:encoded>
			<wfw:commentRss>http://android.vidilab.com/2011/09/boeing-oprema-787-ice-android-os-uredajima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

