You are on page 1of 87

Upoznavanje Android korisnikog interfejsa

U drugom poglavlju ste nauili neto vie o Activity klasi i njenom ivotnom
ciklusu.
Nauili ste i da aktivnost predstavlja sredstvo za omoguavanje interakcije
izmeu korisnika i aplikacije.
Meutim, ona, sama po sebi, nema svoju reprezentaciju na ekranu.
Umjesto toga, neophodno je da prikaete sadraj ekrana koritenjem pogleda i
grupa pogleda.
U ovom poglavlju ete nauiti neto vie o nainu kako se kreira korisniki
interfejs u Android aplikacijama i kako korisnici mogu da interaguju sa
Vaim aplikacijama.
Pored toga, nauit ete i kako da upravljate promjenama u orijentaciji
ekrana na Android ureajima.

Razumijevanje komponenata ekrana


U drugom poglavlju nauili ste da je osnovna jedinica Android aplikacije
aktivnosti.
Aktivnost omoguava prikazivanje korisnikog interfejsa aplikacije, koja moe
da sadri razliite elemente, kao to su tasteri, obiljeja, polja za prikazivanje
teksta i slino.
Tipino, definiete svoj korisniki interfejs pomou odgovarajue XMLdatoteke
( npr. main.xml datoteke, koja je locirana u res/layout folderu Vaeg projekta),
koja je sljedeeg oblika:
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello />
</LinearLayout>
U toku izvravanja uitatat ete korisniki interfejs definisan u XML datoteci
pomou onCretate() metoda rukovaoca u Vaoj Activity klasi, a zatim ete
iskoristiti setContentView() metod Activity klase:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
U toku prevoenja, svaki element u XML datoteci se prevodi u ekvivalentnu
Android GUI klasu, sa atributima koje definiu metodi.
Nakon toga, Android sistem kreira korisniki interfejs aktivnosti prilikom
njenog uitavanja.

Pogledi i grupe pogleda


Odreena aktivnost sadri poglede i grupe pogleda.
Pogled je element koji ima svoj prikaz na ekranu.
Elementi pogleda su tasteri, obiljeja i polja za prikazivanje teksta.
Pogled se izvodi iz bazne klase android.view.View.
Vie pogleda se moe grupisati u ViewGroup.
ViewGroup ( koji i sam predstavlja specijalni tip pogleda) obezbjeuje da se
pogledi ureuju prema rasporedu i nainu prikazivanja.
Primjeri grupa pogleda su : LinearLayout i FrameLayout.
View Group se izvodi iz bazne klase android .view.ViewGroup.
Android podrava sljedee grupe pogleda:
LinearLayout
AbsoluteLayout
TableLayout
RelativeLayout
FrameLayout
ScrollView
U narednim odjeljcima detaljno su opisane sve grupe pogleda.
Obratite panju da je u praksi esto kombinovanje razliitih tipova rasporeda
elemenata da bi bio kreiran eljeni korisniki interfejs.

LinearLayout
LinearLayout ureuje poglede u jednu kolonu ili jednu vrstu.
Izvedeni pogledi se mogu ureivai ili vertikalno ili horizontalno.
Da biste vidjeli kako funkcionie LinearLayout, razmotrite sljedee elemente,
koji se obino nalaze u main.xml datoteci:
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello />
</LinearLayout>
U mail.xml datoteci primjetit ete da je korijeni element <LinearLayout> i da se
u njemu nalazi <TextView< element.
Element <LinearLayout> definie redosljed u kome se navode pogledi.
Svaki pogled i grupa pogleda imaju odreeni skup zajednikih atributa, neki od
njih su prikazani u tabeli 3-1.
ATRIBUT
layout_width
layout_height
layout_marginTop
layout_marginBottom
layout_marginLeft
layout_marginRight
layout_gravity
layout_weight
layout_x
layout_y

OPIS
definie irinu za View ili ViewGroup
definie visinu za View ili ViewGruop
sprecifira dodatni prostor iznad View ili ViewGroup elementa
sprecifira dodatni prostor ispod View ili ViewGroup elementa
sprecifira dodatni prostor sa lijeve strane View ili ViewGroup elementa
sprecifira dodatni prostor sa desne strane View ili ViewGroup elementa
sprecifira kako se pozicioniraju izvedeni pogledi
specifira koliko dodatnog prostora u rasporedu treba da se alocira na pogled
sprecifira x kordinatu View ili ViewGroup elemenata
sprecifira y kordinatu View ili ViewGroup elemenata

Layout_weight i layout_gravity atributi se mogu primjenjivati samo kada je


View ili LinearLayout ili TableLayout.
irina <TextView> elementa ispunjava cjelokupnu irinu osnovnog elementa
(koji je u ovom primjeru cijeli ekran) koritenjem fill_parent konstante.
Njihova visina je definisana pomou wrap_content konstante, to znai da je
odreeno visinom sadraja (u naem primjeru to je tekst koji se prikazuje u
njemu).
Ukoliko ne elite da <TextView> pogled zauzima cijelu vrstu, definiite njihov
layout_width atribut tako da bude wrap_content, kao to je prikazano u
sljedeem primjeru:
<TextView
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/hello />
U prethodnom kodu definie se irina pogleda da bude jednaka irini teksta koji
se prikazuje u posmatranom elementu.
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<TextView
android:layout_width=100dp
android:layout_height=wrap_content
android:text=@string/hello />
<Button
android:layout_width=160dp
android:layout_height=wrap_content
android:text=Button
android:onClick=onClick />
</LinearLayout>

JEDINICE MJERE
Prilikom definisanja veliine elementa u Android korisnikom interfejsu, treba da vodite rauna
da se koriste sljedee jedinice mjere:
dp piksel nezavistan od gustine ( eng. density-independent pixel ) ; jedan dp je
ekvivalentan jednom pikselu na ekranu rezolucije 160 dpi ( taka po inu ).
Ovo je preporuena jedinica mjere prilikom specifikacije dimenzije pogleda za
odgovarajui raspored elemenata.
Ekran rezolucije 160 dpi definie osnovnu gustinu ( rezoluciju ) koja se koristi u Android
operativnom sistemu.
Moete se koristiti oznake dp ili dip prilikom navoenja piksela koji su nezavisni od
gustine.
sp piksel nezavisan od rezolucije ( eng. scale-independent pixel ).
To je identino sa dp, a preporuuje se za definisanje veliine fontova.
pt taka, point ( eng. point ).Definisana je kao 1/72 ina, na osnovu fizike veliine
ekrana.
px piksel ( eng. pixel ). Odgovara aktuelnoj veliini piksela na ekranu. Koritenje ove
jedinice nije preporuljivo, jer korisniki interfejs nee biti ispravno prikazan na
ureajima koji imaju razliite rezolucije.

Sljedei korak je definisanje irine


TextView i Button pogleda, to se izvrava
koritenjem apsolutne vrijednosti.
U naem primjeru irina za TextView
definisana je na 100, a Button 160 dp. Prije
nego to vidite kako e ovako definisani
pogledi izgledati na razliitim ekranima sa
razliitim gustinama piksela, veoma je
znaajno da razumijete kako Android
operativni sistem prepoznaje ekrane
razliitih veliina i gustina piksela.
Na slici 3-1 prikazan je ekran telefona
Nexus S. Ovaj telefon sadri ekran veliine
4 ina (po dijagonali), a irina ekrana je
2,04 ina. Njegova rezolucija je 480
(irina) x 800 (visina) piksela.

Slika 3-1

Sa 480 piksela koji su rasporeeni po irini od 2,04 ina, dobija se gustina


piksela od oko 235 taaka po inu (eng. dots per inch, skraeno dpi).
Kao to vidite na osnovu slike, gustina piksela ekrana zavisi od veliine ekrana i
rezolucije.
Android operativni sistem definie i prepoznaje sljedee etiri gustine ekrana
(gustine taaka na ekranu):

low density (ldpi) 120 dpi


medium density (mdpi) 160 dpi
high density (hdpi) 240 dpi
extra high density (xhdpi) 320 dpi

Va ureaj e pripadati nekoj od grupa koje su navedene u prethodnoj listi.


Nexus S se tretira kao hdpi ureaj, jer je njegova gustina piksela blia 240 dpi.
Meutim HTC Hero sadri ekran veliine 3,2 ina (po dijagonali), odnosno
rezoluciju 320x480 piksela. Njegova gustina piksela je oko 180 dpi. Zbog toga
se on smatra mdpi ureajem, jer je njegova gustina piksela blia vrijednosti od
160 dpi.

Da biste provjerili kako e pogledi koji su definisani u XML datoteci izgledati


prilikom prikazivanja na ekranima razliitih gustina, kreirajte dva AVD ureaja
sa razliitim rezolucijama ekrana i zamiljenim LCD gustinama.
Na slici 3-2 prikazan je AVD ureaj sa rezolucijom 480x800 i LCD gustinom
235, to emulira Nexus S.
Na slici 3-3 prikazan je drugi AVD ureaj, sa rezolucijom od 320x480 piksela i
LCD gustinom 180, to emulira HTC Hero.

Slika 3-2

Slika 3-3

Na slici 3-4 prikazani su pogledi prilikom emulacije na ekranu gustine 235 dpi.
Na slici 3-5 prikazani su pogledi prilikom emulacije na ekranu gustine 180 dpi.

Slika 3-4

Slika 3-5

Koritenjem dp jedinice omoguava da se pogledi uvijek definiu u


odgovarajuom razmjeri, nezavisno od gustine taaka na ekranu Android
operativni sistem automatski skalira veliinu pogleda na osnovu gustine taaka
na ekranu.
Uzmimo Button kao primjer ; ukoliko se ovaj element prikazuje na 180 dpi
ekranu (180 dpi ekran se istovjetno kao i 160 dpi ekran) njegova irina e
iznositi 160 piksela.
Meutim, ukoliko se ovaj element prikazuje na 235 dpi ekranu (koji se tretira
kao 240 dpi ekran) tada e irina biti 240 piksela.

NAIN KONVERTOVANJA DP U PX
Formula za konvertovanje dp jedinica u px jedinice (piksele) je sljedeeg oblika:
Trenutni pikseli = dp*(dpi/160), gdje dpi ima vrijednost 120, 160, 240 ili 320.
Zbog toga, kada je rije o Button elementu i 235 dpi ekranu, njegova prava irina je 160.
*(240/160) = 240 px. Prilikom prikazivanja na 180 dpi emulator (koji e tretira kao 160 dpi
ureaj), njegova prava veliina u pikselima iznosi 160* (160/160) = 160 px.
U ovom primjeru jedan dp je ekvivalentan jednom pikselu.
Da biste potvrdili da je ovo zaista tano, moete da iskoristite getWidth() metod View objekta i
da odredite irinu u pikselima:
public void onClick(View view) {
Toast.makeText(this,
String.valueOf(view.getWidth()),
Toast.LENGTH_LONG).show();
}
ta bi se dogodilo da, umjesto dp, definiete veliinu koritenjem piksela ( px ) ?
<TextView
android:layout_width=100px
android:layout_height=wrap_content
android:text=@string/hello />
<Button
android:layout_width=160px
android:layout_height=wrap_content
android:text=Button
android:onClick=onClick/>

Na slici 3-6 prikazano je kako Label i Button elementi izgledaju na 235 dpi
ekranu.
Na slici 3-7 vide se isti elementi, ali na 180 dpi ekranu.
U ovom primjeru Android operativni sistem ne izvrava nikakvu konverziju,
poto su sve veliine izraene u pikselima.
Uopteno ( kada je rije o ekranima jednake veliine), ukoliko za definisanje
pogleda primjenjujete piksele, prikaz e biti manje na ureaju sa veom
vrijednou dpi ekrana, u odnosu na ureaje sa manjoj vrijednou dpi ekrana.
U prethodnom primjeru navedeno je i da je orijentacija ekrana vertikalna:
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >

Slika 3-6

Slika 3-7

Podrazumijevana orijentacija je horizontalna, pa ukoliko izostavite


android:orientation atribut prikaz e biti kao na slici 3-8.

Slika 3-8

U LinearLayout nainu prikaza moete da primjenite layout_weight i


layout_gravity atribute za definisanje pogleda, kao to je prikazano u sljedeoj
modifikovanoj main.xml datoteci:
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<Button
android:layout_width=160dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=left
android:layout_weight=1 />
<Button
android:layout_width=160dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=center
android:layout_weight=2 />
<Button
android:layout_width=160dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=right
android:layout_weight=3 />
</LinearLayout>

Na slici 3-9 prikazan je poloaj za prikazivanje razliitih podataka, kao i visina


prikaza.
Atribut layout_gravity ukazuje na pozicije kojima treba da tee elementi koji se
prikazuju, dok atribut layout_weight specificira raspodjelu raspoloivog
prostora.
U primjeru tri tastera zauzimaju oko 16,6 % (1/(1+2+3)*100),
33,3% (2/(1+2+3)*100) i 50 % (3/(1+2+3)*100) raspoloivog po visini,
respektivno.

Slika 3-9

Ukoliko promijenite orijentaciju za LinearLayout raspored elemenat da bude


horizontalna, neophodno je da promijenite irinu svakog elementa, tako da bude
0 dp da bi raspored elemenata bio onakav kakav je prikazan na slici 3-10:
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=horizontal >
<Button
android:layout_width=0dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=left
android:layout_weight=1 />
<Button
android:layout_width=0dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=center_horizontal
android:layout_weight=2 />
<Button
android:layout_width=0dp
android:layout_height=wrap_content
android:text=Button
android:layout_gravity=right
android:layout_weight=3 />
Slika 3-10
</LinearLayout>

Apsolute Layout
ApsoluteLayout omoguava da specificirate tanu lokaciju izvedenih elemenata.
Razmotrimo sljedei korisniki interfejs, koji je definisan u main.xml datoteci:
<AbsoluteLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android >
<Button
android:layout_width=188dp
android:layout_height=wrap_content
android:text=Button
android:layout_x=126px
android:layout_y=361px />
<Button
android:layout_width=113dp
android:layout_height=wrap_content
android:text=Button
android:layout_x=12px
android:layout_y=361px />
</AbsoluteLayout>

Na slici 3-11 prikazana su dva Button pogleda ( testirana na 180 dpi AVD
ureaju), koja su locirana na navedenim pozicijama koritenjem
android_layout_x i android_layout_y atributa.
Meutim, postoji odreeni problem kada se primjenjuje AbsoluteLayout, a
odnosi se na aktivnost koja se prikazuje na ekranu sa visokom rezolucijom
( slika 3-12).
Zbog toga se AbsoluteLayout vie ne koristi od Android 1.5 verzije operativnog
sistema ( iako postoji podrka i u najnovijoj verziji).
Treba da izbjegavate da ga primjenjujete u svom korisnikom interfejsu, jer
nema garancije da e postojati podrka u buduim verzijama Android
operativnog sistema.
Umjesto toga, neophodno je da primjenjujete drugaije rasporede elemenata,
koji su prikazani u ovom poglavlju.

Slika 3-11

Slika 3-12

TableLayout
TableLayout grupie elemente u vrste i kolone.
Moete da koristite <TableRow> element da biste oznaili vrstu u posmatranoj
tabeli.
Svaka vrsta moe da sadri jedan ili vie pogleda.
Svaki pogled koji definiete u odreenoj vrsti formira eliju.
irina svake kolone odreena je najveom irinom svake eliji u posmatranoj
koloni.
Razmotrimo sadraj sljedee main.xml datoreke:
<TableLayout
xmlns:android=http://schemas.android.com/apk/res/android
android:layout_height=fill_parent
android:layout_width=fill_parent >
<TableRow>
<TextView
android:text=User Name:
android:width =120dp
/>
<EditText
android:id=@+id/txtUserName
android:width=200dp />
</TableRow>
<TableRow>
<TextView
android:text=Password:
/>
<EditText
android:id=@+id/txtPassword
android:password=true
/>
</TableRow>
<TableRow>
<TextView />
<CheckBox android:id=@+id/chkRememberPassword
android:layout_width=fill_parent
android:layout_height=wrap_content

android:text=Remember Password
/>
</TableRow>
<TableRow>
<Button
android:id=@+id/buttonSignIn
android:text=Log In />
</TableRow>
</TableLayout>
Na slici 3-13 moete vidjeti kako izgleda prethodno definisan korisniki
interfejs u Android emulatoru.
Obratite panju da u prethodnom primjeru postoje dvije kolone i etiri vrste
TableLayout rasporedu elemenata.
elija koja se nalazi neposredno ispod Password TextView elementa sadi
prazan <TextView/> element.
Da niste ovako definisali korisniki interfejs, Remember Password polje za
potvrdu bi bilo prikazano ispod Password TextView elementa, kao to je
prikazano na slici 3-14.

Slika 3-13

Slika 3-14

RelativeLayout
RelativeLayout raspored omoguava da specificirate nain na koji se izvedeni
elementi prikazuju u odnosu na osnovne elemente.
Razmotrimo sljedeu main.xml datoteku:
<?xml version=1.0 encoding=utf-8?>
<RelativeLayout
android:id=@+id/RLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android >
<TextView
android:id=@+id/lblComments
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Comments
android:layout_alignParentTop=true
android:layout_alignParentLeft=true />
<EditText
android:id=@+id/txtComments
android:layout_width=fill_parent
android:layout_height=170px
android:textSize=18sp
android:layout_alignLeft=@+id/lblComments
android:layout_below=@+id/lblComments
android:layout_centerHorizontal=true />
<Button
android:id=@+id/btnSave
android:layout_width=125px
android:layout_height=wrap_content
android:text=Save
android:layout_below=@+id/txtComments
android:layout_alignRight=@+id/txtComments />

<Button
android:id=@+id/btnCancel
android:layout_width=124px
android:layout_height=wrap_content
android:text=Cancel
android:layout_below=@+id/txtComments
android:layout_alignLeft=@+id/txtComments />
</RelativeLayout>

Obratite panje da svaki pogled koji


definisan RelativeLayout rasporedom
elemenata sadri atribute koji
omoguavaju definisanje ureenje
jednog elementa u odnosu na drugi.
Moete koristite sljedee atribute:
layout_alignParentTop
layout_alignParentLeft
layout_alignLeft
layout_alignRight
layout_below
layout_centerHorizontal

Slika 3-15

Vrijednost svakog od navedenih atributa predstavlja identifikator za pogled koji


refencirate.
U prethodnom XML kodu definisan je korisniki intefejs iji je izgled prikazan
na slici 3-15.

FrameLayout
FrameLayout raspored elemenata moete da koristite za prikazivanje jednog
pogleda.
Pogledi koje dodajete u FrameLayout se uvijek postavljaju u odnosu na gornji
lijevi ugao rasporeda.
Razmotrimo sadraj sljedee main.xml datoteke:
<?xml version=1.0 encoding=utf-8?>
<RelativeLayout
android:id=@+id/RLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android >
<TextView
android:id=@+id/lblComments
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Hello, Android!
android:layout_alignParentTop=true
android:layout_alignParentLeft=true />
<FrameLayout
android:layout_width=wrap_content
android:layout_height=wrap_content
android:layout_alignLeft=@+id/lblComments
android:layout_below=@+id/lblComments
android:layout_centerHorizontal=true >
<ImageView
android:src = @drawable/droid
android:layout_width=wrap_content
android:layout_height=wrap_content />
</FrameLayout>
</RelativeLayout>

U ovom primjeru definisan je FrameLayout u RelativeLayout rasporedu


elemenata.
U FrameLayout rasporedu elemenata ugraen je ImageView.
Korisniki interfejs je prikazan na slici 3-16.

Slika 3-16

Ukoliko definiete jo jedan pogled ( kao to j e Button) u FrameLayout


rasporedu elemenata, prikaz e se preklapati sa prikazom elemenata definisanih
u prethodnom pogledu ( slika 3-17) :
<?xml version=1.0 encoding=utf-8?>
<RelativeLayout
android:id=@+id/RLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android
>
<TextView
android:id=@+id/lblComments
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Hello, Android!
android:layout_alignParentTop=true
android:layout_alignParentLeft=true
/>
<FrameLayout
android:layout_width=wrap_content
android:layout_height=wrap_content
android:layout_alignLeft=@+id/lblComments
android:layout_below=@+id/lblComments
android:layout_centerHorizontal=true >
<ImageView
android:src = @drawable/droid
android:layout_width=wrap_content
android:layout_height=wrap_content />
<Button
android:layout_width=124dp
android:layout_height=wrap_content
android:text=Print Picture />
</FrameLayout>
</RelativeLayout>

Slika 3-17

ScrollView
ScrollView je specijalni tip FrameLayout prikaza.
On omoguava korisnicima da pristupaju razliitim pogledima u listi pogleda,
koji zauzmimaju vie prostora, nego to to omoguava fiziki displej.
ScrollView moe da sadri samo jedan izvedeni pogled ili ViewGroup, koji je
obino, LinearLayout tipa.
Sadraj sljedee main.xml datoteke prikazuje ScrollView koji sadri
LinearLayout , u kome se prikazuju Button i EditText:
<ScrollView
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android >
<LinearLayout
android:layout_width=fill_parent
android:layout_height=wrap_content
android:orientation=vertical >
<Button
android:id=@+id/button1
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Button 1 />
<Button
android:id=@+id/button2
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Button 2 />
<Button
android:id=@+id/button3
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Button 3 />
<EditText
android:id=@+id/txt
android:layout_width=fill_parent
android:layout_height=600dp />

<Button
android:id=@+id/button4
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Button 4 />
<Button
android:id=@+id/button5
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Button 5 />
</LinearLayout>
</ScrollView>
Ukoliko uitate prethodni kod u Androdi emulatoru, bit e prikazan korisniki
interfejs sa slike 3-18.

Slika 3-18

Poto EditText automatski dobija folus, ispunjava cjelokupni prostor koji je


definisan za aktivnost ( poto je njegova visina postavljena na 600 dp).
Da biste sprijeili postavljanje u fokus, neophodno je da dodate sljedea dva
atributa u <LinearLayout> element:
<LinearLayout
android:layout_width=fill_parent
android:layout_height=wrap_content
android:orientation=vertical
android:focusable=true
android:focusableInTouchMode=true >

Sada ete moi da vidite tastere i da skrolujete kroz listu pogleda ( slika 3-19).

Slika 3-19

U nekim situacijama ete moda eljeti da EditText bude automatski u fokusu,


ali da se ne prikazuje soft ulazni panel (tastatura) automatski (to se deava u
realnom ureaju).
Da biste sprijeili da se prikae tastatura dodajte sljedei atribut u <activity>
element definisan u AndroidManifest.xml datoteci:
<activity
android:label=@string/app_name
android:name=.LayoutsActivity
android:windowSoftInputMode=stateHidden >
<intent-filter >
<action android:name=android.intent.action.MAIN />
<category android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>

PRILAGOAVANJA PRIKAZA ORIJENTACIJI UREAJA


Jedna od kljunih funkcija savremenih pametnih telefona je njihova mogunost
da ekran mijenja orijentaciju, to je karakteristika Android operativnih sistema.
Ovaj operativni sistem podrava dvije orijentacije ekrana: uspravan (portrait) i
horizontalan (landscape).
Na osnovu inicijalnih podeavanja, prilikom promjene orijentacije ekran
Android ureaja, ponovo se iscrtava trenutna aktivnost koja se prikazuje, ali
tako da se sadraj prikazuje u novoj orijentaciji.
Ovo omoguava onCreate () metod aktivnosti, koji se izvrava svaki put kada se
promijeni orijentacija prikaza.
Meutim, prilikom ponovnog prikazivanja pogleda, ponovo se iscrtavaju
elementi na svojih originalnim lokacijama (zavisno od rasporeda elemenata koji
je pri tome selektovan).
Na slici 3-20 prikazan je jedan od prethodnih primjera, i to u portrait i landscape
reimu.
Obratite panju da u landscape reimu postoji dosta slobodnog prostora na
desnoj strani ekrana, koji se moe iskoristiti.
Bilo koji pogled definisan u donjem dijelu ekrana moe da bude sakriven kada
se koristi landscape orijentacija.

Slika 3-20

Moete da primjenjuje dvije tehnike za rukovanje promjenama orijentacije


ekrana:
anchoring najjednostavniji nain je uvrivanje prikaza za etiri ivice
ekrana.
Prilikom promjene orijentacije ekrana, prikaz elemenata se uredno
ureuje u odnosu na ivice ekrana.
resizing and repositioning za razliku od uvrivanja i centralizovanja,
kao jednostavnih tehnika za obezbjeivanje promjena prikaza elemenata u
pogledima na osnovu promjene orijentacije ekrana, napredna tehnika je
promjena veliine svakog pojednanog prikaza elementa shodno trenutnoj
orijentaciji ekrana.

Uvrivanje prikaza
Uvrivanje prikaza moe se jednostavno postii koritenjem RelativeLayout
rasporeda.
Razmotrite sljedeu main.xml datoteku, koja sadri pet Button pogleda
ugraenih u <RelativeLayout> element:
<RelativeLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android>
<Button
android:id=@+id/button1
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Left
android:layout_alignParentLeft=true
android:layout_alignParentTop=true />
<Button
android:id=@+id/button2
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Right
android:layout_alignParentTop=true
android:layout_alignParentRight=true />
<Button
android:id=@+id/button3
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Left
android:layout_alignParentLeft=true
android:layout_alignParentBottom=true />
<Button
android:id=@+id/button4
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Right
android:layout_alignParentRight=true
android:layout_alignParentBottom=true />

<Button
android:id=@+id/button5
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Middle
android:layout_centerVertical=true
android:layout_centerHorizontal=true />
</RelativeLayout>
Obratite panju na sljedee atribute koji se nalaze u razliitim Button
pogledima:
layout_alignParentLeft ureuje pogled u odnosu na lijevu stranu
osnovnog pogleda
layout_alignParentRight ureuje pogled u odnosu na desnu stranu
osnovnog pogleda
layout_alignParentTop ureuje pogled u odnosu na gornji dio osnovnog
pogleda
layout_alignParentBottom ureuje pogled u odnosu na donji dio
osnovnog pogleda
layout_centerVertical centrira se pogled po vertikali u odnosu na
osnovni pogled
layout_centerHorizontal centrira s pogled po horizontali u odnosu na
osnovni pogled

Na slici 3-21 predstavljena je aktivnost prilikom prikaza u portrait reimu.

Slika 3-21

Prilikom promjene orijentacije ekrana tako da bude u landscape reimu, etiri


tastera su ureena u odnosu na etiri ivice ekrana, a centralni taster na sreditu
ekrana proiren je, tako da prikazuje preko cijelog ekrana (slika 3-22).

Slika 3-22

Promjena veliine i poloaja


Pored uvrivanja prikaza za etiri ivice ekrana, postoji i jednostavniji nain za
podeavanje korisnikog interfejsa na osnovu orijentacije ekrana, a to je
kreiranje posebnog res/layout foldera koji sadri XML datoteke za korisniki
interfejs za svaku pojedinanu orijentaciju.
Da biste podrali landscape reim, moete a kreirate novi folder u res folderu i
da mu date naziv layout-land (to predstavlja skraenicu od landscape).
Na slici 3-23 prikazan je novi folder koji sadri main.xml datoteku.
U sutini, main.xml datoteka koja se nalazi u layout folderu definie korisniki
interfejs za aktivnost u portraid reimu, dok main.xml datoteka u layout-land
folderu definie korisniki interfejs u landscape reimu.

Slika 3-23

Sljedei kod predstavlja sadraj koja se nalazi u layout folderu:


<?xml version=1.0 encoding=utf-8?>
<RelativeLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android>
<Button
android:id=@+id/button1
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Left
android:layout_alignParentLeft=true
android:layout_alignParentTop=true />
<Button
android:id=@+id/button2
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Right
android:layout_alignParentTop=true
android:layout_alignParentRight=true />
<Button
android:id=@+id/button3
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Left
android:layout_alignParentLeft=true
android:layout_alignParentBottom=true />
<Button
android:id=@+id/button4
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Right
android:layout_alignParentRight=true
android:layout_alignParentBottom=true />
<Button
android:id=@+id/button5
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Middle

android:layout_centerVertical=true
android:layout_centerHorizontal=true />
</RelativeLayout>

Sljedei kod predstavlja sadraje main.xml datoteke u layout-land folderu


(naredbe prikazane podebljanim slovima su dodatni pogledi definisani u
landscape reimu):
<?xml version=1.0 encoding=utf-8?>
<RelativeLayout
android:layout_width=fill_parent
android:layout_height=fill_parent
xmlns:android=http://schemas.android.com/apk/res/android>
<Button
android:id=@+id/button1
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Left
android:layout_alignParentLeft=true
android:layout_alignParentTop=true />
<Button
android:id=@+id/button2
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Top Right
android:layout_alignParentTop=true
android:layout_alignParentRight=true />
<Button
android:id=@+id/button3
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Left
android:layout_alignParentLeft=true
android:layout_alignParentBottom=true />
<Button
android:id=@+id/button4
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Bottom Right
android:layout_alignParentRight=true
android:layout_alignParentBottom=true />
<Button
android:id=@+id/button5
android:layout_width=fill_parent

android:layout_height=wrap_content
android:text=Middle
android:layout_centerVertical=true
android:layout_centerHorizontal=true />
<Button
android:id=@+id/button6
android:layout_width=180px
android:layout_height=wrap_content
android:text=Top Middle
android:layout_centerVertical=true
android:layout_centerHorizontal=true
android:layout_alignParentTop=true />
<Button
android:id=@+id/button7
android:layout_width=180px
android:layout_height=wrap_content
android:text=Bottom Middle
android:layout_centerVertical=true
android:layout_centerHorizontal=true
android:layout_alignParentBottom=true />
</RelativeLayout>

Kada se aktivnost uita u portrait reimu prikazuju se etiri tastera, kao to


moete vidjeti na slici 3-24.

Slika 3-24

Kada se aktivnost uita u landscape reimu, prikazuje se sedam tastera


(slika 3-25), to pokazuje da su uitani drugi XML dokumenti prilikom
postavljanja ureaja u razliitoj orijentaciji.

Slika 3-25

Primjenjujui ovaj metod, prilikom promjene orijentacije ureaja Android


operativni sistem automatski uitava odgovarajuu XML datoteku za vau
aktivnost zavisno od trenutne orijentacije ekrana.

UPRAVLJANJE PROMJENAMA ORIJENTACIJE EKRANA


Nakon to ste saznali kako se implementiraju dvije tehnike za adaptiranje
prikaza na ekranu nakon promjene orijentacije ureaja, razmotrimo sada ta se
dogaa sa stanjem aktivnosti prilikom promjene orijentacije.
U sljedeoj vjebi demonstrirano je stanje aktivnosti prilikom promjene
orijentacije ureaja.
Datoteka sa kodom Orientations.zip moe se preuzeti sa adrese Wrox.com
1. Koristei Eclipse integrisano razvojno okruenje, kreirajte novi Android
projekat i nazovite ga Orientations.
2. U main.xml datoteku dodajte sljedee naredbe, prikazane podebljanim
slovima:
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<EditText
android:id=@+id/txtField1
android:layout_width=fill_parent
android:layout_height=wrap_content />
<EditText
android:layout_width=fill_parent
android:layout_height=wrap_content />
</LinearLayout>

3. U OrientationsActivitiy.java datoteku dodajte sljedee naredbe prikazane


podebljanim slovima:
package net.learn2develop.Orientations;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class OrientationsActivity extends Activity {
/**Izvrava se prilikom prvog definisanja aktivnosti */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(StateInfo, onCreate);
}
@Override
public void onStart() {
Log.d(StateInfo, onStart);
super.onStart();
}
@Override
public void onResume() {
Log.d(StateInfo, onResume);
super.onResume();
}
@Override
public void onPause() {
Log.d(StateInfo, onPause);
super.onPause();
}
@Override
public void onStop() {
Log.d(StateInfo, onStop);
super.onStop();
}
@Override
public void onDestroy() {
Log.d(StateInfo, onDestroy);

super.onDestroy();
}
@Override
public void onRestart() {
Log.d(StateInfo, onRestart);
super.onRestart();
}
4. Pritisnite F11 tipku da biste debagovali aplikaciju u Android emulatoru.
5. Unesite odreeni tekst u dva EditText pogleda ( slika 3-26).

Slika 3-26

6. Promijenite orijentaciju ureaja u Android emulatoru pristiskom Ctrl+F11


kombinacije tipki. Na slici3-27 je emulator u landscape reimu.
Obratite panju da je prvi EditText pogled i dalje vidjljiv, ali da je drugi
EditText pogled prazan.

Slika 3-27
7. Pratite ono to se prikazuje prilikom izvravanja u LogCat prozoru
( neophodno je da preete u Debug nain prikaza u eclipse integrisanom
razvojnom okruenju).
Trebalo bi da vidite sljedei tekst:
12-15 12:27:20.747: D/StateInfo(557): onCreate
12-15 12:27:20.747: D/StateInfo(557): onStart
12-15 12:27:20.747: D/StateInfo(557): onResume
...
12-15 12:39:37.846: D/StateInfo(557): onPause
12-15 12:39:37.846: D/StateInfo(557): onStop
12-15 12:39:37.866: D/StateInfo(557): onDestroy
12-15 12:39:38.206: D/StateInfo(557): onCreate
12-15 12:39:38.216: D/StateInfo(557): onStart
12-15 12:39:38.257: D/StateInfo(557): onResume

Nain funkcionisanja
Na osnovu rezultata koji su prikazani u LogCat prozoru, oigledno je da se
aktivnost uklanja kada ureaj mijenja orijentaciju:
12-15 12:39:37.846: D/StateInfo(557): onPause
12-15 12:39:37.846: D/StateInfo(557): onStop
12-15 12:39:37.866: D/StateInfo(557): onDestroy
Aktivnost se nakon toga, ponovo kreira:
12-15 12:39:38.206: D/StateInfo(557): onCreate
12-15 12:39:38.216: D/StateInfo(557): onStart
12-15 12:39:38.257: D/StateInfo(557): onResume
Veoma je znaajno da razumijete ovo funkcionisanje, zato to je neophodno da
izvrite dodatne korake da biste sauvali stanje Vae aktivnosti prije nego to se
promijeni orijentacija ureaja.
Vaa aktivnost moe da ima odreene promjenjive koje sadre vrijednost
neophodne za dodatna izraunavanja u toj aktivnosti.
Treba da sauvate stanje svake aktivnosti pomou onPause () metoda, koje se
izvrava uvijek kada se u toku izvravanja odreene aktivnosti mijenja
orijentacija ureaja.
U sljedeem dijelu predstavljena su dva naina za snimanje ovih informacija o
stanju.
Jo jedno znaajno ponaanje aplikacije koje treba da razumijete je da su samo
pogledi kojima su definisani nazivi (pomou android:id atributa) u odreenoj
aktivnosti sa perzistentnim stanjem nakon uklanjanja aktivnosti.
Korisnik moe da promijeni orijentaciju prilikom unosa odgovarajueg teksta u
EditText polje.
Kada se to dogodi, bilo koji tekst koji je unijet u EditText polje bit e
perzistentan i automatski e se restaurirati nakon ponovnog iniciranja ove
aktivnosti.
Obratno: ukoliko ne definiete naziv EditText pogleda navoenjem android:id
atributa, aktivnost nee moi da sauva tekst koji je korisnik prije promjene
orijentacije ureaja unio u odgovarajue polje.

uvanje informacija o stanju u toku promjena konfiguracije


Do sada ste nauili da se prilikom promjene orijentacije ekrana prekida
aktivnost, a zatim ponovo inicira.
Vodite rauna da prilikom ponovnog iniciranja aktivnost trenutnog stanja moe
biti uklonjeno.
Prilikom uklanjanja aktivnosti, inicira se jedan od navedenih metoda ili oba:
onPause () ovaj metod se inicira uvijek kada se aktivnost ukloni ili
proslijedi u pozadinu.
onSaveInstanceState () ovaj metod moe takoer da se inicira kada
aktivnost treba da bude uklonjena ili postavljena u pozadinu, kao i
onPause () metod.
Meutim, za razliku od onPause () metoda, onSaveInstanceState () se ne
inicira kada se aktivnost ukloni sa steka (to se javlja ako korisnik pritisne
back taster) zato to ne postoji potreba za kasnijim restauriranjem stanja
aktivnosti.
Da biste sauvali stanje odreene aktivnosti, moete uvijek da implementirate
onPause () metod, a zatim da koristite sopstvene naine za uvanje stanja
aktivnosti, kao to su koritenje baze podataka, interne ili eksterne datoteke i
slino.
Ukoliko jednostavno elite da sauvate stanje odreene aktivnosti, tako da se
ona moe kasnije restaurirati prilikom njuenog ponovnog iniciranja (to se
dogaa prilikom promjene orijentacije ureaja) mnogo jednostavniji nain je
implementiranje onSaveInstanceState () metoda, poto on omoguava koritenje
Bundle objekta kao argumenta, koji moete da kopristite da biste snimili stannje
Vae aktivnosti.
U sljedeem kodu prikazano je kako moete da snimite string ID u Bundle
objekat u toku izvravanja onSaveInstanceState () metoda:
@Override
public void onSaveInstanceState(Bundle outState) {
//---snimanje svega to elite da sauvate--outState.putString(ID, 1234567890);
super.onSaveInstanceState(outState);
}

Nakon to se aktivnost ponovo inicira, prvo se izvrava onCreate () metod, a


nakon njega onRestoreInstanceState () metod, koji omoguava da oitate stanje
koje ste prethodno snimili koritenjem onSaveInstanceState () metoda pomou
Bundle objekta kao argumenta:
@ Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//---oitavanje prethodno sauvanih informacija--String ID = savedInstanceState.getString(ID);
}
Iako moete da koristite onSaveInstanceState () metod za snimanje informacija,
obratite panju da mogu da se snime samo informacije o stanju u odgovarajuem
Bundle objektu .
Ukoliko je neophodno da snimite vie sloenih struktura podataka, ovo nije
odgovarajue rjeenje za Vas.
Jo jedan metod koji moete koristiti je onRetainNonConfigurationInstance ().
On se inicira kada aktivnost treba da se ukloni usljed konfiguracijskih promjena
(kao to su promjena orijentacije ekrana, raspoloivost tastature i slino).
Podatke o trenutnom stanju moete da snimite pomou ovog metoda na sljedei
nain:
@Override
public Object onRetainNonConfigurationInstance() {
//---snimite ovdje ta god elite;koristi se Objects tip--return(Some text to preserve);
}

Obratite panju da ovaj metod vraa Object tip, koji omoguava da snimite
skoro svaki drugi tip podataka.
Snimljeni tip podataka moete da ekstrahujete u onCreate () metodu, koristei
getLastNonConfigurationInstance () metod:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(StateInfo, onCreate);
String str = (String) getLastNonConfigurationInstance();
}
Metodi onRetainNonConfigurationInstance () i getLastNonConfiguratioInstance
() se koriste kada je neophodno momentalno sauvati odreene podatke, kao
naprimjer, prilikom preuzimanja odreenih podataka sa web servisa i promjene
orijentacije ekrana.
U ovom scenariju snimanje podataka koritenjem dva prethodno navedena
metoda je mnogo efikasnija, nego ponovo preuzimanje podataka.

Detektovanje promjene orijentacije


Nekada je neophodno da znate trenutnu orijentaciju ureaja u toku izvravanja
aplikacije, da biste je utvrdili, moete da koristite WindowsManager klasu.
U sljedeem primjeru prikazano je kako se programski detektuje trenutna
orijentacija koja se odnosi na aktivnost:
import android.view.Display;
import android.view.WindowManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//---oitavanje trenutnih informacija o prikazu--WindowManager wm = getWindowManager();
Display d = wm.getDefaultDisplay();
if (d.getWidth() > d.getHeight()) {
//---landscape mode--Log.d(Orientation, Landscape mode);
}
else {
//---portrait mode--Log.d(Orientation, Portrait mode);
}
}

Metod getDefaultDisplay () vraa Display objekat koji predstavlja ekran


ureaja.
Moete da oitate njegovu irinu i visinu, odnosno trenutno orijentaciju.

Kontrola orijentacije u aktivnosti


U odreenim situacijama je neophodno da obezbjedite da se aplikacija izvrava
samo u odreenoj orijentaciji ekrana ureaja.
Moda ete pisati igru koja treba da se pregleda samo u landscape reimu.
U ovoj situaciji moete programski da sprijeite promjenu orijentacije
koritenjem setRequestOrientation () metoda Activity klase:
import android.content.pm.ActivityInfo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//---promjena u landscape reim--setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_
LANDSCAPE);
}

Da biste promijenili orijentaciju da bude u portrait reimu, upotrijebite


ActivityInfo.SCREEN_ORIENTATION_PORTRAIT konstantu.

Pored setRequestOrientation () metoda moete da koristite i atribut


android:screenOrientation elementa <activity> u AndroidManifest.xml datoteci
(kao to je prikazano u sljedeem primjeru) da biste ograniili da se aktivnost
izvrava u odreenoj orijentaciji ekrana ureaja:
<?xml version=1.0 encoding=utf-8?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package=net.learn2develop.Orientations
android:versionCode=1
android:versionName=1.0 >
<uses-sdk android:minSdkVersion=14 />
<application
android:icon=@drawable/ic_launcher
android:label=@string/app_name >
<activity
android:label=@string/app_name
android:name=.OrientationsActivity
android:screenOrientation=landscape >
<intent-filter >
<action android:name=android.intent.action.MAIN
/>
<category
android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>
</application>
</manifest>
U prethodnom primjeru ograniena je aktivnost samo na jednoj orijentaciji
(landscape reim) i sprijeeno je da se aktivnost ukloni ; to znai da aktivnost
nee biti uklonjena i da onCreate () metod nee biti ponovo iniciran nakon
promjene orijentacije ureaja.
Postoje jo dvije dodatne vrijednosti koje moete da specificirate u
android:screenOrientation atributu:
portrait portrait reim
sensor zasnovan na akcelerometru (default vrijednost)

KORITENJE LINIJE AKCIJA


Pored fragmenata, jo jedna nova funkcija koja je uvedena u Android 3 i 4 je
Action Bar.
Umjesto tradicionalne naslovne linije, koja je locirana u gornjem dijelu ekrana
ureaja, Action Bar prikazuje ikonu aplikacije i naslov aktivnosti.
Opciono, desno od Action Bar linije nalaze se Action stavke.
Na slici 3-28 prikazana je ugraena Email aplikacija, kod koje se prikazuje
ikona aplikacije, naziv aktivnosti odreene akcione stavke u liniji akcija.
U narednom dijelu detaljnije su opisane akcione stavke.

Slika 3-28

U sljedeoj vjebi prikazano je kako da programski skrivate ili prikazujete


Action Bar.
1. U Eclipse integrisanom razvojnom okruenju kreirajte novi Android
projekat i dajte mu naziv MyActionBar.
2. Pritisnite F11 taster da biste debagovali aplikaciju na Android emulatoru.
Treba da vidite aplikaciju i njen Action Bar, koji je lociran u gornjem
dijelu ekrana (sadri ikonu aplikacije i naziv aplikacije, slika 3-29).

Slika 3-29
3. Da biste sakrili Action Bar, neophodno je da u AndroidManifest.xml
datoteku dodate sljedee linije koje su prikazane podebljanim slovima:
<?xml version=1.0 encoding=utf-8?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package=net.learn2develop.MyActionBar
android:versionCode=1
android:versionName=1.0 >
<uses-sdk android:minSdkVersion=14 />
<application
android:icon=@drawable/ic_launcher
android:label=@string/app_name >
<activity
android:label=@string/app_name
android:name=.MyActionBarActivity
android:theme=@android:style/Theme.Holo.NoActionBar >

<intent-filter >
<action android:name=android.intent.action.MAIN />
<category
android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>
</application>
</manifest>
4. Oznaite naziv projekta u Eclipse integrisanom razvojnom okruenju, a
zato, pritisnite F11 taster, da biste ponovo debagovali aplikaciju u
Android emulatoru. Ovog puta se Action Bar ne prikazuje (slika 3-30).

Slika 3-30
5. Moete i programski ukloniti Action Bar, koristei ActionBar klasu. Da
biste to uradili, neophodno je da prvo uklonite android:theme atribut koji
ste dodali u jednom od prethodnih koraka. To je vano, jer e u
suprotnom, sljedei korak dovesti do pojave izuzetka prilikom izvravanja
aplikacije.
6. Modifikujte MyActionBarActivity.java datoteku na sljedei nain:

package net.learn2develop.MyActionBar;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
public class MyActionBarActivity extends Activity {
/** izvrava se prilikom prvog definisanja aktivnosti. */

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.hide();
//actionBar.show(); //---ponovo se prikazuje--}
}
7. Pritisnite F11 da biste ponovo debagovali aplikaciju u emulatoru.
Action Bar ostaje i dalje skriven.

Nain funkcionisanja
Atribut android:theme omoguava da prekinete prikzazivanje linija akcija u
Vaoj aktivnosti.
Ukoliko postavite da ovaj atribut ima vrijednost
@android:style/Theme.Holo.NoActionBar, nee biti prikazivan Action Bar.
Alternativno, moete programski da dobijete referencu na Action Bar u toku
izvravanja koritenjem getActionBar () metoda.
Izvravanje hide () metoda omoguavanje skrivanje linija akcija, dok
izvravanje show() metoda omoguava njeno ponovno prikazivanje.
Obratite panju da, prilikom koritenja android:theme atributa za sklanjanje
linija akcija, izvravanje getActionBar () metoda daje null u toku izvravanja
aplikacije.
Zbog toga je uvijek bolje da se Action Bar postavlja/ uklanja programski
koritenjem Action Bar klase.

Dodavanje stavki akcija u Action Bar


Pored ikone aplikacije i naziva aktivnosti sa lijeve strane linije akcija, moete da
prikazujete i dodatne stavke one se nazivaju stavke akcija.
Stavke akcija su preice za odreene esto izvravane akcije u aplikaciji.
Ukoliko razvijate aplikaciju za itanje RSS poruka, stavke akcija mogu biti
Refresh feed, Delete feed i Add new feed.
U sljedeoj vjebi prikazano je kako se dodaju stavke akcija u Action Baru.
1. U MyActionBar projekat koji ste kreirali u prethodnom dijelu u
MyActionBarActivity.java datoteku dodajte sljedei kod, prikazan
podebljanim slovima:
package net.learn2develop.MyActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MyActionBarActivity extends Activity {
/** izvrava se prilikom prvog definisanja aktivnosti. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//ActionBar actionBar = getActionBar();
//actionBar.hide();
//actionBar.show(); //---ponovo s prikazuje--}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, Item 1);
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_RO
OM);
}
MenuItem mnu2 = menu.add(0, 1, 1, Item 2);
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_RO
OM);
}
MenuItem mnu3 = menu.add(0, 2, 2, Item 3);
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_RO
OM);
}
MenuItem mnu4 = menu.add(0, 3, 3, Item 4);
{
mnu4.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_RO
OM);
}
MenuItem mnu5 = menu.add(0, 4, 4, Item 5);
{
mnu5.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_RO
OM);
}
}
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {

case 0:
Toast.makeText(this, You clicked on Item 1,
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, You clicked on Item 2,
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, You clicked on Item 3,
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, You clicked on Item 4,
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, You clicked on Item 5,
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
}
2. Pritisnite F11 taster da biste debagovali aplikaciju u Android emulatoru.
Pratite ikone koje se prikazuju u desnom dijelu linija akcija ( slika 3-31).
Ukoliko kliknete MENU taster u emulatoru, bit e prikazane preostale
stavke menija ( slika 3-32).
To je poznato kao overflow meni.
Na ureajima koji nemaju MENU taster overflow meni je prikazan u
obliku ikone sa strelicom.
Na slici 3-33 prikazana je ista aplikacija, koja se izvrava na Asus Eee
Pad Transformer raunaru ( operativni sistem Android 3.2.1).
Nakon to kliknete overflow meni, prikazuju se ostale stavke menija.
3. Ukoliko kliknete stavku menija, Toast klasa prikazuje naziv oznaene
stavke menija ( slika 3-34).

Slika 3-31

Slika 3-32

Slika 3-33

Slika 3.34

4. Pritisnite Control F11 kombinaciju tastera da biste promijenili orijentaciju


ekrana u emulatoru, tako da se primjenjuje landscape reim.
Sada se prikazuju stavke akcija u liniji akcija, kao to je prikazano na slici
3-35, pri emu su tri ikone, a jedna je tekstualna.

Slika 3-35

Nain funkcionisanja
U liniji akcija se prikazuju stavke akcija izravanjem onCreateOptionsMenu ()
metoda aktivnosti:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}

U prethodnom primjeru koristi se CreateMenu () metod za prikazivanje liste


stavki menija:
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, Item 1);
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu2 = menu.add(0, 1, 1, Item 2);
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu3 = menu.add(0, 2, 2, Item 3);
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu4 = menu.add(0, 3, 3, Item 4);
{
mnu4.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu5 = menu.add(0, 4, 4, Item 5);
{
mnu5.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}

Da bi kao svaka stavka menija bila prikazana akciona stavka , neophodno je da


izvrite setShowAsAction () metod , uz navoenje
SHOW_AS_ACTION_IF_ROOM konstante.
Tako da definiete da Androdi ureaj prikazuje kao stavku menija akcionu
stavku, pod uslovom da postoji dovoljno prostora za njeno prikazivanje.
Kada korisnik selektuje odgovarajuu stavku menija, izvrava se metod
onOptionsItemSelected () :
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
Ovdje pozivate MenuChoice () metod koji ste samostalno definisali da biste
provjerili koja stavka menija je kliknuta, a zatim se prikazuje odgovarajua
poruka:
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case 0:
Toast.makeText(this, You clicked on Item 1,
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, You clicked on Item 2,
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, You clicked on Item 3,
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, You clicked on Item 4,
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, You clicked on Item 5,

Toast.LENGTH_LONG).show();
return true;
}
return false;
}

Podeavanje akcionih stavki i ikona aplikacije


U prethodnom primjeru su stavke menija prikazivane bez dodatnog teksta.
Ukoliko elite da prikazujete i tekst za stavku akcije pored ikone, neophodno je
da koristite | operator i MenuItem .
SHOW_AS_ACTION_WITH_TEXT Konstantu:

MenuItem mnu1 = menu.add(0, 0, 0, Item 1);


{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(
MenuItem.SHOW_AS_ACTION_IF_ROOM |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
Ovim kodom se omoguava da se ikona prikazuje zajedno sa tekstom
odgovarajue stavke menija ( slika 3-36).

Slika 3-36

Korisnici mogu da kliknu akcione stavke, ali i ikonu aplikacije u liniji akcija.
Kada korisnik klikne ikonu aplikacije, izvrava se onOptionsItemSelected ()
metod.
Da biste identifikovali ikonu aplikacije koja se poziva, neophodno je da
provjerite identifikacioni broj stavke u odnosu na android.R.id.home konstantu:
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this,
You clicked on the Application icon,
Toast.LENGTH_LONG).show();
return true;
case 0:
Toast.makeText(this, You clicked on Item 1,
Toast.LENGTH_LONG).show();
return true;
case 1:
//...
}
return false;
}
Da biste omoguili da ikoan alikacije moe da se klikne, neophodno je da
izvrite setDisplayHomeAsUpEnabled ():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
//actionBar.hide();
//actionBar.show(); //---ponovo se prikazuje--}

Na slici 3-37 prikazan je taster u obliku strelice pored ikone aplikacije.

Slika 3-37

Ikona aplikacije se esto koristi u aplikacijama da bi se omoguilo korisnicima


da se vrate na glavnu aktivnost aplikacije.
Vaa aplikacija moe da sadri vie aktivnosti, a Vi moete da koristite njenu
ikonu kao preicu koja e korisnicima omoguiti da se vrate direktno na glavnu
aktivnost Vae aplikacije.
Da biste to uradili, pogodno je da kreirate Intent objekat i da ga definiete
koritenjem Intent.FLAG_ACTIVITY_CLEAR_TOP indikatora ( flega):
case android.R.id.home:
Toast.makeText(this,
You clicked on the Application icon,
Toast.LENGTH_LONG).show();
Intent i = new Intent(this, MyActionBarActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
return true;
Intent.FLAG_ACTIVITY_CLEAR_TOP indikator obezbjeuje da se ukloni niz
aktivnosti koje se nalaze u back steku kada korisnik klikne ikonu aplikacije u
liniji akcija.
Zbog toga, ukoliko korisnik klikne back taster, ostale aktivnosti u aplikaciji nee
ponovo biti prikazivane.

PROGRAMSKO KREIRANJE KORISNIKOG INTERFEJSA


Do sada ste korisnike interfejse aplikacija u ovom poglavlju kreirali
koritenjem XML datoteka.
Kao to smo ve pominjali, moete da ih kreirate i koritenjem koda.
Ovaj pristup je koristan ukoliko korisniki interfejs mora da se dinamiki
mijenja utoku izvravanja aplikacije.
Pretpostavimo da kreirate sistem za rezervisanje bioskopskih karata i da Vaa
aplikacija treba da prikazuje mjesto u svakom bioskopu i da se koriste odreeni
tasteri.
U ovom primjeru bit e neophodno da dinamiki generiete korisniki nterfejs
na osnovu bioskopa kojeg je oznaio korisnik u odreenom trenutku.

U sljedeoj vjebi prikazan je kod koji je neophodan da biste mogli da


dinamiki kreirate korisniki interfejs za odreenu aktivnost.
Datoteku sa kodom UICode.zip moete da preuzmete sa adrese Wrox.com
1. U Eclipse integrisanom razvojnom okruenju kreirajte novi Android
projekat i dajte mu naziv UICode.
2. U UICodeActivity.java datoteku dodajte sljedee naredbe, koje su
prikazane podebljanim slovima:
package net.learn2develop.UICode;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class UICodeActivity extends Activity {
/** izvrava se prilikom prvog definisanja aktivnosti. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
//---parametri pogleda--LayoutParams params =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
//---definisanje rasporeda elemenata--LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
//---kreiranje textview prikaza--TextView tv = new TextView(this);
tv.setText(This is a TextView);
tv.setLayoutParams(params);

//---kreiranje tastera--Button btn = new Button(this);


btn.setText(This is a Button);
btn.setLayoutParams(params);
//---dodavanje textview prikaza--layout.addView(tv);
//---dodavanje tastera--layout.addView(btn);
//---kreiranje parametara rasporeda elemenata--LinearLayout.LayoutParams layoutParam =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT );
this.addContentView(layout, layoutParam);
}
}
3. Pritisnite F11 taster da biste debagovali aplikaciju u Androdi emulatoru.
Na slici 3-38 prikazana je aktivnost koja je definisana prethodnim kodom.

Slika 3-38

Nain funkcionisanja
U ovom primjeru prvo se postavlja u komentar setContentView () naredba, tako
da se ne uitava korisniki interfejs koji je definisan u main.xml datoteci.
Nakon toga se kreira LayoutParams objekat, u cilju specificiranja layout
parametra, koji e koristiti drugi pogledi ( njih ete kasnije definisati):
//---parametri pogleda--LayoutParams params =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
Takoer ste kreirali LinearLayout objekat, koji sadri sve poglede u Vaoj
aktivnosti:
//---definisanje rasporeda elemenata--LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
Nakon toga, definisali ste TextView i Button pogled:
//---kreiranje textview prikaza--TextView tv = new TextView(this);
tv.setText(This is a TextView);
tv.setLayoutParams(params);
//---kreiranje tastera--Button btn = new Button(this);
btn.setText(This is a Button);
btn.setLayoutParams(params);
Zatim ste ih dodali u LinearLayout objekat:
//---dodavanje textview prikaza--layout.addView(tv);
//---dodavanje tastera--layout.addView(btn);

Kreirali ste i LayoutParams objekat, koji e se koristiti u LinearLayout objektu:


//---kreiranje parametara rasporeda elemenata--LinearLayout.LayoutParams layoutParam =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT );
Konano, dobili ste LinearLayout objekat u svoju aktivnost:
this.addContentView(layout, layoutParam);
Kao to moete da vidite, koritenje koda za kreiranje korisnikog interfejsa je
zaista teak posao.
Zbog toga, dinamiki generiite kod za korisniki interfej samo kada je to zaista
neophodno.

PRAENJE OBAVJETENJA ZA KORISNIKI INTERFEJS


Korisnici interaguju sa Vaom aplikacijom koritenjem korisnikog interfejsa u
dva nivoa: na nivou aktivosti i na nivou pogleda.
Na nivou aktivnosti Activity klasa sadri metode koje moete da predefiniete
za svoje potrebe.
Opte metodi koje moete da predefiniete u Vaim aktivnostima su sljedee:
onKeyDown izvrava se kada je pritisnut taster i ne rukuje se ni jednim
pogledom u konkretnoj aktivnosti
onKeyUp izvrava se kada se pusti odreeni taster i ne rukuje se ni sa
jednim pogledom u konkretnoj aktivnosti
onMenuItemSelected izvrava se kada korisnik selektuje stavku menija
panela
onMenuOpened izvrava se kada korisnik otvori meni panela

Predefinisanje metoda definisanih u aktivnosti


Da bismo demonstrirali kako se obavlja interakcija sa aktivnostima, u sljedeem
primjeru predefinisani su odreeni metodi koji su definisani u baznoj klasi
aktivnosti.
Datoteku sa kodom UIActivity.zip moete preuzeti sa Wrox.com
1. U Eclipse integrisanom razvojnom okruenju kreirajte novi Android
projekat i dajte mu naziv UIActivity.
2. U main.xml datoteku dodajte sljedee naredbe, koje su prikazane
podebljanim slovima ( zamjenjuju TextView):
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width=fill_parent
android:layout_height=fill_parent
android:orientation=vertical >
<TextView
android:layout_width=214dp
android:layout_height=wrap_content
android:text=Your Name />
<EditText
android:id=@+id/txt1
android:layout_width=214dp
android:layout_height=wrap_content />
<Button
android:id=@+id/btn1
android:layout_width=106dp
android:layout_height=wrap_content
android:text=OK />
<Button
android:id=@+id/btn2
android:layout_width=106dp
android:layout_height=wrap_content
android:text=Cancel />

</LinearLayout>
3. U UIActivity. Java datoteku dodajte sljedee naredbe, koje su prikazane
podebljanim slovima:
package net.learn2develop.UIActivity;
import android.app.Activity;
import android.view.KeyEvent;
import android.os.Bundle;
import android.widget.Toast;
public class UIActivityActivity extends Activity {
/** izvrava se prilikom prvog definisanja aktivnosti. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
Center was clicked,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
Left arrow was clicked,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
Right arrow was clicked,
Toast.LENGTH_LONG).show();
break;

case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
Up arrow was clicked,
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
Down arrow was clicked,
Toast.LENGTH_LONG).show();
break;
}
return false;
}
4. Pritisnite F11 taster da biste debagovali aplikaciju u Android emulatoru.
5. Kada se zavri uitavanje aktivnosti, unesite odreeni tekst u EditText.
Nakon toga, kliknite streliicu nanie na direkcionom pedu.
Posmatrajte poruku koja se prikazuje na ekranu, kao to je prikazano na
slici 3- 39.

Slika 3-39

Nain funkcionisanja
Nakon iniciranja aktivnosti, pokaziva e zasvijetliti u EditText polju, jer se
nalazi u fokusu .
U MainActivity klasi predeinisali ste onKeyDown () metod bazne Activity
klase:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
//...
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
//...
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
//...
break;
case KeyEvent.KEYCODE_DPAD_UP:
//...
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
//...
break;
}
return false;
}

U Android operativnom sistemu , kada pritisnete bilo koji taster na svom


ureaju, pogled koji trenutno u fokusu pokuava da rukuje generisanim
dogaajem.
U naem primjeru, kada je EditText u fokusu i kada pritisnete taster , edit Text
pogled rukuje dogaajem i prikazuje karakter koji ste upravo pritisnuli.
Meutim, ukoliko pritisnete direkcione tastere ( strelica navie ili nanie),
EditText ogled nee rukovati ovim dogaajima; umjesto toga, dogaaj se
prosljeuje aktivnosti, a zatim se prikazuje poruka koja ukazuje koji je taster
pritisnt.
Obratite pannju da je fokus i sada prosljeen na sljedei pogled, koji se odnosi
na OK taster.
Ukoliko EditText pogled ve sadri odreeni tekst i pokaziva je na kraju
unijetog teksta, pritiskanjem strelice se ne inicira onKeyDown () metod;
jednostavno se pomijera pokaziva jednom mjesto ulijevo.
Razlog je injenica da je EditText pogled, ve rukovao tim dogaajem.
Ukoliko, umjesto toga, pritisnete desnu strelicu
( kada se pokaziva nalazi na kraju teksta), izvrava se onKeyDown() metod
( poto u tom sluaju EditText pogled ne rukuje ovim dogaajem).
Isto vai i za situaciju u kojoj se pokaziva nalazi na poetku EditText polja.
Ukoliko, kliknere lijevu strelicu, inicira se izvravanje onKeyDown () metoda, a
ukoliko kliknete desnu strelicu, jednostavno se pomijera pokaziva za jedan
karakter udesno.
Kada je OK taster u fokusu, pritisnete centralni taster na direkcionom pedu.
Obratite panju da se ne prikazuje poruka Cener was clicked.
Razlog toga je injenica da Button pogled sam ne rukuje dogaajem koji se
odnosi na pritiskanjem tastera.
Zbog toga, onKeyDown () metod nije identifikovao odogaaj.
Obratite panju da onKeyDown () metod vraa logiku ( bulovu) vrijednost kao
rezultat izvravanja.
Treba da se vrati vrijednost true ukoliko elite da ukaete sistemu da ste zavrili
razmatranje dogaaja, odnosno da sistem ne mora da nastavi obradu.

Razmorimo sljedeu situaciju u kojoj se vraa vrijednost true nakon


identifikovanja svakog pojedinanog tastera:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
Center was clicked,
Toast.LENGTH_LONG).show();
//break;
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
Left arrow was clicked,
Toast.LENGTH_LONG).show();
//break;
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
Right arrow was clicked,
Toast.LENGTH_LONG).show();
//break;
return true;
case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
Up arrow was clicked,
Toast.LENGTH_LONG).show();
//break;
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
Down arrow was clicked,
Toast.LENGTH_LONG).show();
//break;
return true;
}

return false;
}
Ukoliko isprobate ovaj kod, utvrdit ete da ne moete da obavljate navigaciju
izmeu pogleda koritenja tastera sa strelicama.

Registrovanje dogaaja za poglede


Pogledi mogu da iniciraju dogaaje prilikom interakcije sa korisnicima.
Kada korisnik pritisne odreeni taster, neophodno je da se rukuje dogaajem da
se izvri odgovarajua akcija.
Da biste to uradili, eksplicitno registrujte dogaaje na pojedinane poglede.
Koristei isti primjer koji smo razmatrali u prethodnom dijelu, recimo da su za
aktivnost definisana dva Button pogleda; zbog toga , moete da registrujete
dogaaje koji se odnose na pritiskanje tastera koritenjem anonimne klase, kao
to je prikazano u sljedeem kodu:
package net.learn2develop.UIActivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class UIActivityActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//---dva tastera su povezana za jednog istog rukovaoca
dogaajima--Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(btnListener);
}
//---kreirajte anonimne klase za identifikovanje pritiskanja tastera--private OnClickListener btnListener = new OnClickListener()
{

public void onClick(View v)


{
Toast.makeText(getBaseContext(),
((Button) v).getText() + was clicked,
Toast.LENGTH_LONG).show();
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
//...
}
}

Ukoliko sada kliknete OK ili Cancel taster, prikazuje se odgovarajua poruka


( slika 3-40), objezbjeujui da se dogaaj ispravno povee sa odgovarajuim
kodom.

Slika 3-40

Pored anonimne klase za rukovaoca dogaaja, moete da definiete i anonimnu


unutranju klasu za rukovanje dogaajima.
U sljedeem primjeru prikazano je kako moete da koristite onFocusChange()
metod za EditText pogled:
import android.widget.EditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//---dva tastera su povezana za jednog istog rukovaoca dogaajima-Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(btnListener);
//---kreiranje anonimne unutranje klase koja identifikuje fokus--EditText txt1 = (EditText)findViewById(R.id.txt1);
txt1.setOnFocusChangeListener(new
View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus) {
Toast.makeText(getBaseContext(),
((EditText) v).getId() + has focus - +
hasFocus,
Toast.LENGTH_LONG).show();
}
});
}

Kao to je prikazano na slici 3-41, kada EditText pogled dobije fokus, prikazuje
se odgovarajua poruka na ekranu.

Slika 3-41

Koji metod treba da koristite prilikom definisanja rukovaoca dogaajima???


Anonimna klasa je korisna ukoliko imate vie pogleda koje razmatrate jednim
rukovaocem dogaajima.
Anonimna unutranja klasa ( drugi opisani metod) je korisna ukoliko definiete
rukovaoca dogaajem za pojedinani pogled.

Rukovalac click dogaajem za dva tastera se mora napisati na sljedei nain


( koritenjem anonimne unutranje klase) :
//---the two buttons are wired to the same event handler--Button btn1 = (Button)findViewById(R.id.btn1);
//btn1.setOnClickListener(btnListener);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//---uraditi neto--}
});
Button btn2 = (Button)findViewById(R.id.btn2);
//btn2.setOnClickListener(btnListener);
btn2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//---uraditi neto--}
});

You might also like