Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
v4.2 JellyBean
Premessa
Tanto tempo passato dalla prima guida, troppo. L'intento era quello di costruire una guida solida e completa nel corso del tempo, senza retta, con la consape!olezza di do!er are qualcosa di grande per un pubblico !asto come i programmatori Android. La prima guida "a a!uto un successo abnorme, uori le aspettati!e iniziali, si parla di circa trentamila download. #ra molto basilare e manca!ano !arie cose ma soprattuto gratuita$ La prima guida gratuita$ Per c"i non mi conosce o non "a letto la guida precedente mi ripresento% mi c"iamo Alberto ed attualmente sono uno s!iluppatore .&#T per una azienda c"e si occupa di pubblica amministrazione. 'n passato sono stato anc"e programmatore su sistemi P(S con il buon linguaggio ), mai abbandonato e sempre in !oga. Sono stato relatore a !ari Linu*+a,, Linu*-eeting, .a!a+a, a Palermo, in attesa di qualc"e con erenza uori. La mia passione per Android nasce molti anni a, quando, leggendo molti libri, mi sono c"iesto se !ale!a la pena are un ebook gratuito, da donare alla communit,. Presto atto l'ebook uscito uori, +icembre /010, ed adesso dopo / anni pronta la seconda !ersione, completa ed aggiornata. A met2 /01/, sono stato anc"e docente per un corso Android all'3ni!ersit2 di Palermo, do!e non inir4 mai di ringraziare 5incenzo 5irgilio dell'associazione Sputni* di a!ermi dato iducia ed a!er partorito un corso eccezionale. Ribadisco, c"e non metter4 mai in !endita questa guida, ma purtroppo sar2 l'ultima riguardo Android. Spero in qualc"e casa editrice per scri!ere qualcosa di pi6 serio e pi6 concreto. Anc"e questa guida si basa sulla bre!it2 e concisione. &on ci sar2 molta teoria, quella la lasciamo ai libri !eri, ma solo lo stretto e necessario per capire le ondamenta della programmazione su sistemi Android. Sta!olta la guida sar2 pubblicata sul mio sito www.sprik.it, non per atto di egoismo, ma perc" ibasblog.it "a cessato di esistere.
&on inir4 mai di ringraziare i miei e* collaboratori, c"e "anno creduto in dall'inizio in questo progetto, pinosiciliano e cd125. Anc"e se le nostre strade si sono ormai separate, per moti!i la!orati!i, non si dimenticano certe cose% incoraggiamenti, le nostre lung"e riunioni e tutto il resto.
-enu 7enerale
'ntroduzione di base ....................................................................................................................... 8 'nstallazione 9............................................................................................................................... : 3ser)ontrols ................................................................................................................................. /; &oti ication ................................................................................................................................... 8: La,out-anager ............................................................................................................................. << =ardware ....................................................................................................................................... ;/ -iscellanea, parte 1 ...................................................................................................................... ;: S-S e c"iamate ............................................................................................................................ >/ )oncetti a!anzati 9...................................................................................................................... :0 -iscellanea, parte / ..................................................................................................................... :; )onclusione ................................................................................................................................ 108
'ntroduzione di base
7li e!enti del mouse sono quelli c"e pi6 comunemente a!!engono mentre utilizziamo un P)% basta muo!ere il mouse o cliccare su un punto dello sc"ermo per generare un e!ento. 7li e!enti del mouse si di!idono in tre sottoGcategorie% #!enti generati dai pulsanti del mouse #!enti generati dal mo!imento del mouse #!enti generati dal trascinamento del mouse La prima sottoGcategoria de inisce e!enti quali%
)lick, c"e !iene generato quando si clicca su un oggetto +oppio)lick, c"e !iene generato con un doppio click Pulsante-ousePremuto, c"e !iene generato quando si tiene premuto il pulsante sinistro del mouse Pulsante-ouseRilasciato, c"e !iene generato quando si rilascia il pulsante sinistro del mouse precedentemente premuto
-ouseSopra, c"e !iene generato quando il mouse si muo!e su un oggetto -ouse5ia, c"e !iene generato quando il mouse si sposta da un oggetto -o!imento-ouse, c"e !iene generato quando il mouse si muo!e
Trascina-ouse, c"e !iene generato quando un utente trascina il mouse con il pulsante premuto -ouseTrascina(ggetto, c"e !iene generato quando un utente trascina un oggetto sulla inestra
7li e!enti della tastiera sono quelli classici c"e a!!engono quando premiamo un tasto o una combinazione di essi. 7li e!enti della tastiera si di!idono in% TastoAtti!ato, c"e !iene generato quando un utente preme e rilascia un tasto o quando tiene premuto un tasto TastoPremuto, c"e !iene generato quando quando !iene premuto un tasto TastoRilasciato, c"e !iene generato quando !iene rilasciato un tasto precedentemente premuto
7li e!enti del sistema sono quei e!enti generati con le iterazioni ra degli oggetti, come inestre, ed il sistema. 7li e!enti del sistema si suddi!idono in quattro sottoGcategorie% #!enti generati dal caricamento degli oggetti #!enti generati dalle modi ic"e dellAutente #!enti legati al uoco #!enti generati dai mo!imenti delle inestre La prima sottoGcategoria de inisce e!enti quali%
)arica, c"e !iene generato quando al caricamento degli oggetti Abbandona, unzione opposta a )arica
)ambio, c"e !iene generato quando !iene modi icato il !alore di un oggetto
Perde@uoco, c"e !iene generato quando si esce da un oggetto della 73' Acquista@uoco, c"e !iene generato quando si entra in un oggetto della 73' SelezionaTesto, c"e !iene generato quando si seleziona del testo allAinterno di un campo, di unAetic"etta o di altri oggetti simili
Ridimensiona@inestra, c"e !iene generato quando lAutente riduce o ingrandisce una inestra Scorri@inestra, c"e !iene generato quando si e ettua lo scorrimento della pagina sia con il mouse c"e con i tasti PgSu e Pg7i6.
3nAaltra categoria di e!enti sono quelli generati dagli oggetti standard di una 73' e possono essere classi icati nel seguente modo%
#!enti dAazione% sono gli e!enti generati quando un pulsante stato premuto, quando si atti!a una casella di testo o un pulsante di opzione, quando si seleziona una !oce di un menu , quando si preme B'n!ioD dentro una casella di testo, eccK #!enti di selezione o deselezione in un elenco% sono gli e!enti legati alla selezione di una casella di controllo o di una !oce di menu a sceltaK #!enti di selezione o di deselezione per input% sono gli e!enti generati quando un oggetto in risposta ad un click del mouse o allAutilizzo del tasto di tabulazione.
?uesta piccola introduzione, teorica, agli e!enti ci a capire quanti e!enti !engono generati anc"e solo premendo un tasto o muo!endo il mouse. A li!ello di linguaggio di programmazione non di icile intercettare gli e!enti e gestirli, molti linguaggi acilitano il la!oro, soprattutto quelli equipaggiati di un '+# !isuale c"e ci mette a disposizione tutti gli strumenti per acilitare ed accelerare la programmazione.
'nstallazione
Per comodit2 "o installato la !ersione BJava EE DevelopersD in quanto contiene tutte le librerie .a!a di base ed a!anzati per la!orare anc"e con =T-LN.SPN.S@, c"e possono ri!elarsi utili per particolari scopi di s!iluppo.
+opo a!er e ettuato il download possiamo scompattare l'arc"i!io in una cartella a nostra scelta ed a!!iare l'ambiente.
Alla prima apertura, ci c"ieder2 la cartella per il workspace, il nostro contenitore di progetti.
-ettendo la spunta su B3se t"is as t"e de ault and do not ask againD, al successi!o a!!io non ci c"ieder2 pi6 il workspace e render2 quello scelto precedentemente il prede inito.
Adesso e ettuiamo il download del S+L di base per Android dal sito % "ttp%NNde!eloper.android.comNsdkNinde*."tml Anc"e qui !err2 riconosciuta la piatta orma di s!iluppo e !i mostrer2 il ile da scaricare pi6 appropriato.
Anc"e qui, dobbiamo scompattare l'arc"i!io in una cartella, c"e ser!ir2 per la con igurazione.
Successi!amente dobbiamo installare il plugin di Android per #clipse andando su Help Install !ew "oftware e cliccando sul pulsante #dd della inestra c"e !i !iene proposta
)ome nuo!o repositor$ metteremo un nome a nostra scelta e come indirizzo quello speci ico di google https://dl-ssl.google.com/android/eclipse
Accettiamo le licenze.
'l so tware si installa in maniera autonoma ed in poco tempo, secondo sempre la connessione disponibile, dato c"e de!e scaricare una buona quantit2 dati da internet.
?uanto tutto completato passiamo alla con igurazione del S+L scaricato precedentemente su Preferences #ndroid
+a notare c"e, in questa ultima !ersione per -A), gi2 presente S+L relati!o alla !ersione 8./ di Android. Lo stesso si pu4 notare dall'#ndroid "D% &anager, c"e si tro!a sotto il menu Mindow, do!e sar2 possibile scaricare altre !ersioni del S+L, !arie librerie ed aggiornare le presenti.
Scorrendo la lista, tro!iamo negli e*tra la #ndroid "upport 'i(rar$, c"e ci ser!ir2 per gestire le !ecc"ie !ersioni di Android in modalit2 compatibile. Se non la selezioniamo ci !err2 ric"iesta alla con igurazione del primo progetto. Per creare una nuo!a #)D HAndroid 5irtual +e!iceI, partiamo dal #ndroid )irtual Device &anager, presente sempre sotto il menu Mindow, do!e ci !err2 presentata una lista delle A5+ create. )licc"iamo sul tasto &ew per crearne una nuo!a.
La con igurazione abbastanza semplice e non implica particolari azioni. &el mio caso "o selezionato c"e il dispositi!o da emulare un 7ala*, &e*us, in automatico il programma preparer2 tutto il necessario. Sole impostazioni c"e potremmo modi icare, in questo caso, la selezione delle )amere, do!e sar2 possibile selezionare una e!entuale webcam del nostro P) o notebook, la quantit2 di memoria di una e!entuale sc"eda S+ e lo "naps*ot, do!e !err2 ibernato l'ultimo stato della macc"ina in modo da non do!erla ria!!iare da zero. 'l risultato sar2 una per etta macc"ina !irtuale Android.
"ello#orld
Per aprire un nuo!o progetto andiamo su +ile !ew e dalla lista c"e compare selezioniamo #ndroid #pplication Pro,ect.
)ome primo passo dobbiamo indicare il nome dell'applicazione, del progetto e del pacc"etto. ?uest'ultimo solitamente composto dal nome del sito seguito dal nome del progetto. 'n questa prima parte, sar2 possibile selezionare la !ersione di android su cui destinata l'applicazione e il tema principale.
'l passo successi!o pre!ede impostazioni di base, come la director, del progetto e la possibilit2 di preGcreare o meno acti!it, Hi !ecc"i orm, detto in maniera basilareI.
Lo step successi!o ci mostra c"e possiamo selezionare, per la nostra acti!it, preimpostata, il tipo di acti!it,% !uota, a tutto sc"ermo, impostazioni, ecc.
L'ultima sc"ermata ci c"iede il nome dell'acti!it, creata, il nome del la,out associato e il tipo di na!igazione.
&ella parte sinistra tro!eremo i ile di progetto. Le director, android di base sono di!ise in src, contiene i sorgenti Pa!a gen, contiene i ile generati dal A+T assets, contiene i ile raw ed possibile esplorarla tramite 3R'. (in, contiene i binari generati, compreso il ile apk Heseguibile androidI li(s, contiene le !arie librerie aggiunti!e res, contiene le !arie risorse% la,out, !alori ed *ml di impostazione !ari. 'n un progetto android presente anc"e un ile #ndroid&anifest-.ml c"e contiene le !arie impostazioni dell'applicazione. &ella parte centrale !isualizzeremo tutti i sorgenti e, come nel caso del ile *ml, la sua possibile con igurazione pratica, come la gestione manuale del posizionamento dei controlli o l'aggiunta di string"e, impostazioni, ecc.
Al primo a!!io di esecuzione ci !err2 ric"iesto c"e tipo di applicazione , noi sceglieremo #ndroid #pplication. #' anc"e possibile e ettuare una con igurazione manuale andando su Run Q Run )on igurations.
' ile principali sono due, in questo caso% 'l ile &ain#ctivit$-,ava, cosE composto
// package di base pac$age it.sprik.guida.helloworld; // librerie da importare impor% android.os.Bundle; impor% android.app.Activity; impor% android.view.Menu; // classe activity dove inseriremo le nostre operazioni da fare public class MainActivity ex%ends Activity // intercettiamo l!evento on"reate che viene eseguito #uando l!activity viene creata $%verride pro%ec%ed void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.activity_main); , // evento per la creazione di un menu- lo analizzeremo successivamente $%verride public boolean on"reate%ptionsMenu&Menu menu) // 'nflate menu getMenu'nflater&).inflate&+.menu.activity_main- menu); re%urn %rue; , ,
activit$/main-.ml
.+elative/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" 0mlns1tools2"http://schemas.android.com/tools" android1layout3width2"match_parent" android1layout3height2"match_parent" tools1conte0t2".MainActivity" 4 .5e0t*iew android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1layout3center6orizontal2"true" android1layout3center*ertical2"true" android1te0t2"@string/hello_world" /4 ./+elative/ayout4
&el primo ile con la riga set"ontent*iew&+.layout.activity_main); associamo il ile la,out acti!it,Rmain all'acti!it, corrente. ?uindi quando !err2 creata l'acti!it, -ainActi!it, !err2 utilizzato il la,out presente in acti!it,Rmain.*ml. &el secondo ile utile notare android1te0t2"@string/hello_world" questo comporta c"e, in!ece di scri!ere direttamente il testo da assegnare, lo conser!iamo in una !ariabile di risorsa di tipo stringa. ?uesti !alori sono conser!ati sotto la cartella NresN!aluesNstrings.*ml cosE composto%
.70ml version2"1.0" encoding2"ut !""74 .resources4 .string name2"app_name"46ello8orld./string4 .string name2"hello_world"46ello world9./string4 .string name2"menu_settings"4(ettings./string4 ./resources4
L'editor di eclipse ci aiuter2 ad editare questo ile, senza metterci materialmente le mani, cliccandoci sopra. &aturalmente, quando noi andremo a ric"iamare android1te0t2"@string/hello_world" si ar2 ri erimento alla stringa impostata #string name$"hello_world"%&ello world'#/string% Lo stesso procedimento !iene utilizzato per editare altre risorse. #sempio
3ser )ontrols
Te*t5iew, Auto)ompleteTe*t5iew, -ultiAuto)ompleteTe*t5iew e )"eckedTe*t5iew #ditTe*t Jutton, 'mageJutton e ToggleJutton RadioJutton e )"eckJo* List5iew 7rid5iew +atePicker e TimePicker Analog)lock e +igital)lock )"ronometer 'mage5iew ProgressJar, RatingJar e SeekJar Spinner #*pandableList5iew Meb5iew
#' acile notare c"e, caso di Te*t5iew e )"eckedTe*t5iew, per modi icare il testo di base basta editare la propriet2 te*t. Le propriet2 in comune, come la,outRwidt" e la,outR"eig"t ser!ono per impostare la grandezza del componente% illRparent sta per riempi il contenitore e wrapRcontent la grandezza di de ault del componente. Sia per Auto)ompleteTe*t5iew sia per -ultiAuto)ompleteTe*t5iew bisogna caricare le parole !ia codice, ed utilizzeremo un Arra,Adapter per are ci4.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); ArrayAdapter.(tring4 aa 2 ne' ArrayAdapter.(tring4&%*isandroid.+.layout.simple_dropdown_item_1line- ne' (tring:; <'nglese<- <(pagnolo<- <5edesco<<'taliano<,); Auto"omplete5e0t*iew actv 2 &Auto"omplete5e0t*iew) find*iewBy'd&+.id.t)tauto); actv.setAdapter&aa); MultiAuto"omplete5e0t*iew mactv 2 &MultiAuto"omplete5e0t*iew)%*is.find*iewBy'd&+.id.t)tmulti); mactv.setAdapter&aa); mactv.set5okenizer&ne' MultiAuto"omplete5e0t*iew."omma5okenizer&)); ,
'l codice abbastanza semplice% !engono rica!ati i due componenti tramite l'id de inito nel la,out e !iene utilizzato lo stesso Arra,Adapter per caricare le parole. 3n Arra,Adapter una specie di !ettore, nel caso nostro tipizzato a String Hquindi un !ettore di string"eI, do!e le string"e passate come parametri !engono adattate ad elementi del componente identi icato, in questo caso simpleRdropdownRitemR1line, cio semplice lista ad una colonna. &el caso della -ultiAuto)ompleteTe*t5iew da notare il metodo set0okenizer, do!e !iene speci icato c"e il carattere speciale c"e de!e are da separatore una !irgola. 'l risultato inale questo
Edi%&ex%
L'oggetto Edit0e.t la comune Te*tJo* di qualsiasi altro linguaggio di programmazione. Permette l'inserimento di testo e di gestire gli e!enti relati!i al suo contenuto.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .=dit5e0t android1id2"@(id/edit1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1hint2".crivi /ualcosa..." /4 .5e0t*iew android1id2"@(id/testo" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"" /4 .//inear/ayout4
La propriet2 *int ser!e a de inire un messaggio iniziale, solitamente come suggerito al testo da inserire, !iene !isualizzato di colore grigio c"iaro e quando si comincia a scri!ere scompare.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); te0t 2 &5e0t*iew)%*is.find*iewBy'd&+.id.testo); =dit5e0t edit> 2 &=dit5e0t)%*is.find*iewBy'd&+.id.edit1); edit>.add5e0t"hanged/istener&ne' 5e0t8atcher&) $%verride public void before5e0t"hanged&"har(e#uence arg?- in% arg>- in% arg@- in% argA) , $%verride public void on5e0t"hanged&"har(e#uence arg?- in% arg>- in% arg@- in% argA) te0t.set5e0t&arg?); , $%verride public void after5e0t"hanged&=ditable s) , , ,);
&ell'esempio proposto, tramite l'e!ento on0e.t1*anged, controllo se cambiato del testo nella #ditTe*t e l'assegno tramite il metodo set0e.t alla Te*t5iew. +a notare c"e il testo modi icato possibile tro!arlo come primo argomento dell'e!ento, nel nostro caso era la !ariabile arg0. #' possibile rica!are il testo dalla #ditTe*t, come nella Te*t5iew ed in molti controlli di tipo testo, con il metodo get0e.t, c"e restituisce la sequenza di caratteri contenuta nel controllo. 7li altri due e!enti, be oreTe*t)"anged e a terTe*t)"anged, ser!ono rispetti!amente ad intercettare prima e dopo la modi ica del testo contenuto nel controllo.
#sempio
&el componente 'mageJutton notiamo c"e presente un attributo contentDescription. ?uest'ultimo ser!e a descri!ere il tipo di contenuto !isi!o ed presente in ogni componente di tipo immagine.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); Button btn> 2 &Button) find*iewBy'd&+.id.-tn1); btn>.set%n"lick/istener&ne' %n"lick/istener&) $%verride public void on"lick&*iew arg?) 5oast.make0e)t&getApplication"onte0t&)- <"lick di 5est<5oast.23450&_2645).show&); , ,); , public void 5est"lick&*iew view) 5oast.make0e)t&getApplication"onte0t&)- <"lick di 5est 'mmagine<- 5oast.23450&_2645).show&); ,
+al codice andiamo a gestire gli e!enti di click dei componenti in due di!ersi modi% il primo associare un listener Hgestore e!entiI c"e intercetta la pressione del tasto He!ento on)lickI, in questo caso 3n1lick'istener associato al componente JuttonK il secondo metodo associare un metodo direttamente nella gestione del la,out, nel nostro caso nel la,out del componente 'mageJutton stato con igurato l'attributo on)lick sul metodo Test)lick.
Risultato
Per quanto riguarda il ToggleJutton possibile intercettare l'e!ento on1*ecked1*ange oppure direttamente tramite il metodo is1*ecked per !eri icare se impostato su (n o su ( .
0adioBu%%on e (*ec$Box
3na 1*eck2o. il classico componente di spunta, utilizzato spesso da selettore per opzioni. La 4adio2utton Hpulsante rotondoI, come la )"eckJo*, permette di scegliere delle opzioni con la particolarit2 c"e sono esclusi!e. 'n altre parole, si inseriscono una serie di RadioJutton in un contenitore 4adio5roup Hgruppi di RadioJuttonI e se ne potr2 scegliere solo una delle !arie disponibili.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .+adioCroup android1id2"@(id/rd-group1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1orientation2"hori*ontal" 4 .+adioButton android1id2"@(id/rd-1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2"7rimo" android1checked2"true" /4 .+adioButton android1id2"@(id/rd-8" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2".econdo" /4 .+adioButton android1id2"@(id/rd-9" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2"0er*o" android1enabled2" alse" /4 ./+adioCroup4 ."heckBo0 android1te0t2"7rimo" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1checked2"true" /4 ."heckBo0 android1te0t2".econdo" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1checked2" alse" /4 ."heckBo0 android1te0t2"0er*o" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1enabled2" alse" /4 .//inear/ayout4
Sia per il componente )"eckJo* sia per il RadioJutton gli attributi utilizzati per atti!are e selezionare sono rispetti!amente ena(led e c*ecked. Sono entrambi di tipo booleano, quindi se per esempio enabled impostato su alse, il componente sar2 disatti!ato e di conseguenza non selezionabile, in!ece se c"ecked impostato su true, il componente sar2 preselezionato.
Risultato
Per entrambi si pu4 usare il metodo is1*ecked per controllare quale componente stato selezionato.
1is%!ie'
3na 'ist)iew il basilare componente per la !isualizzazione di una lista di elementi.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 ./ist*iew android1id2"@(id/listview1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
?ui al posto di un Arra,Adapter abbiamo utilizzato un 'ist#dapter c"e si adatta meglio al componente List5iew.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); (tring:; cols 2 ne' (tring:; <=lemento ><- <=lemento @<- <=lemento A<- <=lemento D<,; /ist*iew list> 2 &/ist*iew)%*is.find*iewBy'd&+.id.listview1); /istAdapter adapter 2 ne' ArrayAdapter.(tring4&%*is- android.+.layout.simple_list_item_1list>.setAdapter&adapter);
cols); ,
'l codice molto semplice, nel nostro adapter !erranno inserite le string"e caricate sul !ettore cols e sar2 di tipo simple/list/item/1, o!!ero lista semplice ad un elemento. Risultato
2rid!ie'
)ome suggerisce il nome, una 5rid)iew una griglia di elementi !isualizzati a !ideo.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Crid*iew android1id2"@(id/grid1" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1num"olumns2"auto_ it" android1gravity2"center" /4 .//inear/ayout4
La propriet2 num1olumns de inisce il numero di colonne in cui de!e essere di!isa la griglia. Per semplicit2, nell'esempio, stato impostato ad auto/fit in modo da di!idere in automatico le colonne secondo il numero di elementi caricati.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); Crid*iew grid 2 &Crid*iew)%*is.find*iewBy'd&+.id.grid1); (tring:; cols 2 ne' (tring:; <Erimo<- <(econdo<- <5erzo<- <Fuarto<- <Fuinto<- <(esto<<(ettimo<- <%ttavo<- <Gono<- <Becimo<,; /istAdapter adapter 2 ne' ArrayAdapter.(tring4&%*is- android.+.layout.simple_list_item_1cols); grid.setAdapter&adapter); ,
)ome per la List5iew abbiamo utilizzato un ListAdapter per de inire gli elementi della griglia.
Da%e3ic$er e &ime3ic$er
'l DatePicker !iene utilizzato per selezionare una data. 'l 0imePicker, in!ece, !iene utilizzato per selezionare un orario.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .BateEicker android1id2"@(id/date7icker1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" /4 .5imeEicker android1id2"@(id/time7icker1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" /4 .//inear/ayout4
Analog(loc$ e Digi%al(loc$
#nalog1lock il classico orologio analogico. Digital1lock rappresenta l'orologio digitale.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Analog"lock android1id2"@(id/analog1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1layout3gravity2"center_hori*ontal" /4 .Bigital"lock android1id2"@(id/digit1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" /4 .//inear/ayout4
(*ronome%er
'l 1*ronometer rappresenta il cronometro digitale, poco utile a prima !ista, ma per applicazioni speci ic"e pu4 essere un !alido componente.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 ."hronometer android1id2"@(id/chr1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .Button android1id2"@(id/-tnstart" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/start" /4 .Button android1id2"@(id/-tnstop" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/stop" /4 .//inear/ayout4
&ell'esempio abbiamo utilizzato due pulsanti, start e stop, rispetti!amente per iniziare e ermare il cronometro.
priva%e "hronometer cr>; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); cr> 2 &"hronometer)%*is.find*iewBy'd&+.id.chr1); Button btnstart 2 &Button)%*is.find*iewBy'd&+.id.-tnstart); btnstart.set%n"lick/istener&ne' %n"lick/istener&) $%verride public void on"lick&*iew arg?) cr>.setBase&(ystem"lock.elapsed:ealtime&)); cr>.start&); , ,); Button btnstop 2 &Button)%*is.find*iewBy'd&+.id.-tnstop); btnstop.set%n"lick/istener&ne' %n"lick/istener&) $%verride public void on"lick&*iew arg?) cr>.stop&); , ,); ,
+a notare il metodo set2ase c"e ser!e a resettare il cronometro, in questo caso, prima di arlo ripartire.
Risultato
/mage!ie'
Image)iew il componente per la !isualizzazione di immagini.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .'mage*iew android1src2"@drawa-le/ic_launcher" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1layout3gravity2"center_hori*ontal" android1contentBescription2"@string/img" /4 .//inear/ayout4
Tramite la propriet2 src possiamo de inire il percorso dell'immagine, in questo caso stata presa dalle risorse interne del progetto.
Per tutti e tre i controlli sono stati utilizzati gli attributi ma. per indicare il !alore massimo c"e pu4 assumere la barra e progress o rating Hnel caso della RatingJarI per de inire il !alore di de ault. +a notare c"e nella ProgressJar stato utilizzato l'attributo st,le c"e permette di de inire il tipo di ProgressJar da !isualizzare. &el nostro caso si tratta della classica barra orizzontale ma potremmo impostare l'attributo in style2"@android:style/=idget_7rogress>ar_2arge" per !isualizzare una ProgressJar circolare. Per la ProgressJar e per la SeekJar possibile utilizzare i metodi getProgress e setProgress per a!ere o modi icare il !alore della barra. 'n!ece, per la RatingJar, i rispetti!i metodi sono get4ating e set4ating.
#sempio
Spinner
Lo "pinner un controllo per !isualizzare e scegliere una opzione su una lista di dati.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .(pinner android1id2"@(id/spinner" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
&ell'esempio proposto abbiamo utilizzato una lista di lingue memorizzate nel ile delle risorse Hstrings.*mlI c"e durante l'e!ento on)reate !erranno caricate dall'applicazione. 'l ile strings.*ml cosE composto
.70ml version2"1.0" encoding2"ut !""74 .resources4 .string name2"hello"46ello 8orld- (pinnerEroHectActivity9./string4 .string name2"app_name"4(pinnerEroHect./string4 .string name2"lingua"4(cegli la lingua./string4 .stringIarray name2"lingue"4 .item 4'taliano./item4 .item 4'nglese./item4 .item 4Jrancese./item4 .item 4(pagnolo./item4 .item 45edesco./item4 ./stringIarray4 ./resources4
)ome per una Auto)ompleteTe*t5iew utilizziamo un Arra,Adapter per caricare gli elementi, ma sta!olta in!ece di caricarli dal codice li prendiamo dalle risorse, come accennato precedentemente.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); (pinner s 2 &(pinner) find*iewBy'd&+.id.spinner); final ArrayAdapter."har(e#uence4 adapter 2 ArrayAdapter.create,rom:esource&%*is+.array.lingue- android.+.layout.simple_spinner_item); adapter.setBropBown*iew+esource&android.+.layout.simple_spinner_dropdown_item); s.setAdapter&adapter); s.set%n'tem(elected/istener&ne' %n'tem(elected/istener&) $%verride public void on'tem(elected&Adapter*iew.74 arg?- *iew arg>- in% arg@- long argA) 5oast.make0e)t&getApplication"onte0t&)- adapter.get'tem&arg@).to(tring&)5oast.23450&_2645).show&); , $%verride public void onGothing(elected&Adapter*iew.74 arg?) ,); , ,
Per lo Spinner pre!isto gestire il listener 3nItem"elected'istener c"e contiene due e!enti% onItem"elected e on!ot*ing"elected. 'l primo !iene scatenato quando selezioniamo un elemento della lista, il secondo quando non !iene selezionato nulla, per esempio quando premiamo il tasto Jack e la lista si c"iude.
#sempio
Expandable1is%!ie'
3na E.panda(le'ist)iew una List5iew a due li!elli. &el primo li!ello sono presenti i principali argomenti da rappresentare, nel secondo i !ari elementi raggruppati per argomento.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .=0pandable/ist*iew android1id2"@(id/e)plist1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
public long getCroup'd&in% groupEosition) re%urn groupEosition; , public *iew getCroup*iew&in% groupEosition- boolean is=0panded*iew convert*iew- *iewCroup parent) 5e0t*iew te0t*iew 2 getCeneric*iew&); te0t*iew.set5e0t&getCroup&groupEosition).to(tring&)); re%urn te0t*iew; , public boolean is"hild(electable&in% groupEosition- in% childEosition) re%urn %rue; , public boolean has(table'ds&) re%urn %rue; , , ,
La struttura della classe abbastanza articolata% !iene creato un nuo!o oggetto di tipo E.panda(le'ist#dapter e !engono scritti i metodi per rica!are la posizione degli elementi, numero elementi ed altri c"e possono risultare utili. #sempio
#eb!ie'
)omponente non di poco conto il 6e()iew, un !ero e proprio browser all'interno della nostra applicazione.
+,xml version-"1.0" encoding-"utf-8",. ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .8eb*iew android1id2"@(id/we-view" android1layout3width2" ill_parent" android1layout3height2" ill_parent" /4 .//inear/ayout4
L'uso semplice e nell'esempio mostriamo come !isualizzare la pagina principale di 7oogle. +a notare c"e atti!iamo Java"cript, cosa c"e non molta consigliata per moti!i di sicurezza.
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); 8eb*iew webview 2 &8eb*iew) find*iewBy'd&+.id.we-view); webview.get(ettings&).setMava(cript=nabled&%rue); webview.loadNrl&<http1//www.google.it<);
+a non dimenticare di inserire nel Android-ani est.*ml il permesso ad accedere alla connessione ad internet, altrimenti l'applicazione andr2 in errore.
.usesIpermission android1name2"android.permission.?403:430"/4
Risultato
&oti ication
&oas%
'l controllo 0oast un piccolo contenitore c"e !isualizza un messaggio di testo. Adoperato spesso per noti icare piccoli messaggi o per le segnalazioni di errori.
$%verride pro%ec%ed void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.activity_main); , 5oast.make0e)t&getApplication"onte0t&)- <6ello 5oast9<- 5oast.23450&_2645).show&);
)ome si nota dall'esempio, il controllo !iene creato attra!erso il metodo statico make0e.t, passando come parametri il contesto di !isualizzazione, il messaggio e la lung"ezza H5oast.23450&_2645 o 0oast.23450&_.&6:0I #sempio
4o%ifica%ion
'n questo paragra o !edremo come !isualizzare una noti ica nella #ction2ar. 'l primo la,out mostra l'acti!it, principale, con un pulsante c"e, una !olta cliccato, generer2 la noti ica.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Button android1id2"@(id/-tnnoti ica" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/visuali**a" /4 .//inear/ayout4
&el codice, la parte importante quella relati!a al metodo displa,&oti ica, ric"iamato quando !iene generato un click dal pulsante. 'l PendingIntent ci consentir2 di comunicare con il ser!izio di noti ica caricato su un oggetto !otification&anager. ?uest'ultimo, sar2 utilizzato per in!iare la noti ica creata con il !otification-2uilder, settando opportuni attributi come il titolo, l'oggetto, l'icona, ecc. Al click sulla noti ica !err2 a!!iata l'Acti!it, indicata nella prima 'ntent del metodo displa,&oti ica.
public class GotificationEroHectActivity ex%ends Activity in% 'B3Gotifica 2 >; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); Button btnnotifica 2 &Button) find*iewBy'd&+.id.-tnnoti ica); btnnotifica.set%n"lick/istener&ne' %n"lick/istener&) $%verride public void on"lick&*iew v) displayGotifica&); , ,);
public void displayGotifica&) 'ntent 'nt3Gotifica 2 ne' 'ntent&%*is- Gotification*iew.class); 'nt3Gotifica.put=0tra&<'B3Gotifica<- 'B3Gotifica); Eending'ntent pint 2 Eending'ntent.getActivity&%*is- ?- 'nt3GotificaEending'ntent.,2A5_1A4132_1@::340); GotificationManager nmanager 2 &GotificationManager) get(ystem(ervice&460?,?1A0?64_.3:A?13); Gotification noti 2 ne' Gotification.Builder&%*is) .set"ontent'ntent&pint) .set8hen&(ystem.current0imeMillis&)) .set"ontent5itle&<Gotifica di test<) .set"ontent5e0t&<%ggetto<) .setAuto"ancel&%rue) .set(mall'con&+.drawable.ic_launcher) .build&); nmanager.notify&'B3Gotifica- noti); , ,
L'Acti!it, seguente, c"e !iene a!!iata dopo l'azione sulla noti ica, rica!a l'id della stessa e tramite &oti ication-anager la cancella.
public class Gotification*iew ex%ends Activity $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.noti ication); GotificationManager nmanager 2 &GotificationManager) get(ystem(ervice&460?,?1A0?64_.3:A?13); 5e0t*iew t0tres 2 &5e0t*iew)find*iewBy'd&+.id.t)tnot); t0tres.set5e0t&<'B3Gotifica < O 'nteger.to.tring&get'ntent&).get=0tras&).get'nt&<'B3Gotifica<))); nmanager.cancel&get'ntent&).get=0tras&).get'nt&<'B3Gotifica<)); , ,
Risultato
)essageBox 5Aler%Dialog6
Per creare la nostra buon !ecc"ia &essage2o. utilizzeremo il controllo #lertDialog. 'l la,out mostra solo quello c"e sar2 l'Acti!it, c"e lancer2 la -essageJo* e non il suo la,out, c"e rimarr2 quello standard H anc"e possibile modi icarloI.
.+elative/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" 0mlns1tools2"http://schemas.android.com/tools" android1layout3width2"match_parent" android1layout3height2"match_parent" tools1conte0t2".MainActivity" 4 .Button android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/clicca" android1on"lick2"Aisuali**a" /4 ./+elative/ayout4
Alla pressione del pulsante, !err2 ric"iamato il metodo 5isualizza c"e pro!!eder2 a creare la -essageJo* tramite #lertDialog-2uilder, con le opportune propriet2, messaggio, titolo, pulsanti, ecc. Successi!amente tramite Alert+ialog istanziamo e !isualizziamo la -essageJo*.
public void *isualizza&*iew view) AlertBialog.Builder builder 2 ne' AlertBialog.Builder&conte0t); builder.set5itle&<5itolo<) .setMessage&<(eleziona (' o G%<) .set"ancelable&false) .setEositiveButton&<('<- ne' Bialog'nterface.%n"lick/istener&) $%verride public void on"lick&Bialog'nterface dialog- in% which) 5oast.make0e)t&conte0t- <6ai cliccato ('<- 5oast.23450&_.&6:0).show&); , ,) .setGegativeButton&<G%<- ne' Bialog'nterface.%n"lick/istener&) $%verride public void on"lick&Bialog'nterface dialog- in% which) 5oast.make0e)t&conte0t- <6ai cliccato G%<- 5oast.23450&_.&6:0).show&); , ,); AlertBialog alert 2 builder.create&); alert.show&); ,
Risultato
La,out-anager
1inear1ayou%
'l 'inear'a$out il la,out manager pi6 utilizzato, anc"e se non pi6 il la,out di de ault per un progetto Android. +ispone ogni elemento su ogni riga se l'attributo orientation impostato su vertical e su colonne se impostato su *orizontal.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/testo1" /4 ./inear/ayout android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1orientation2"hori*ontal" 4 .5e0t*iew android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2"@string/testo8" /4 .5e0t*iew android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2"@string/testo9" /4 .//inear/ayout4 .//inear/ayout4
&ell'esempio !iene proposto un insieme di etic"ette di testo disposto su orientation !ertical e "orizontal annidate
Si pu4 !edere acilmente c"e testo1 disposta sulla prima riga e testo/ e testoO H"orizontalI sulla seconda riga. +o!e testo1, testo/ e testoO sono le etic"ette di testo.
&able1ayou%
?uesto tipo di la,out manager dispone i componenti in orma tabellare, di!idendoli per riga.
.70ml version2"1.0" encoding2"ut !""74 .5able/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1stretch"olumns2"1" 4 .5able+ow android1background2"+0000,,"4 .5e0t*iew android1layout3column2"1" android1te0t2"0esto 1" android1gravity2"le t" /4 .5e0t*iew android1te0t2"0esto 8" android1gravity2"right" /4 ./5able+ow4 .5able+ow android1background2"+,,0000"4 .5e0t*iew android1layout3column2"1" android1te0t2"0esto 9" android1gravity2"le t" /4 .5e0t*iew android1te0t2"0esto B" android1gravity2"right" /4 ./5able+ow4 ./5able/ayout4
Si pu4 notare acilmente dal codice c"e oltre al contenitore TableLa,out, !iene utilizzato il contenitore TableRow, c"e rappresenta una riga.
0ela%ive1ayou%
+alla stessa parola, possiamo capire il unzionamento di questo la,out manager. #sso predispone i controlli rispetto ad un controllo precedentemente segnalato. #' di!entato il la,out manager prede inito nei progetti Android, data la sua !ersatilit2 e manegge!olezza.
.70ml version2"1.0" encoding2"ut !""74 .+elative/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2" ill_parent" 4 .5e0t*iew android1id2"@(id/t)t1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/testo1" /4 .5e0t*iew android1id2"@(id/t)t8" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/testo8" android1layout3below2"@id/t)t1" android1layout3margin/eft2"100dp" /4 .5e0t*iew android1id2"@(id/t)t9" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1layout3alignEarent/eft2"true" android1layout3below2"@(id/t)t8" android1layout3margin5op2"10"dp" android1te0t2"@string/testo9" /4 ./+elative/ayout4
&otiamo subito c"e !iene usato l'attributo la$out/(elow per ar capire a quale componente si de!e are ri erimento per indi!iduare la sua posizione. 'n appoggio, si utilizzano gli attributi di tipo margin, come left&argin e margin0op per spostare il controllo rispetto al ri erimento pre issato.
7rame1ayou%
?uesto tipo di la,out manager dispone tutti gli elementi uno sopra l'altro. 3tilizzato per creare piccoli popup o so!rapposizioni !arie.
.70ml version2"1.0" encoding2"ut !""74 .Jrame/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2" ill_parent" 4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"aaaa " /4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"-" /4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"c c c" /4 ./Jrame/ayout4
&ell'esempio !isuale si nota c"e le !arie etic"ette di testo !engono disposte una sopra l'altra rendendo il tutto illeggibile.
1ayou% mis%o
'n questo esempio, "o unito quasi tutti i la,out manager precedentemente illustrati, dando !isione del atto c"e possibile annidarli anc"e se di natura di!ersa.
.70ml version2"1.0" encoding2"ut !""74 .+elative/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" 4 ./inear/ayout android1id2"@(id/layoutlinear" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1orientation2"hori*ontal" 4 .5e0t*iew android1te0t2"?n -asso il 0a-le2ayout" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4 .5able/ayout android1id2"@(id/layoutta-le" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1stretch"olumns2"1" android1layout3below2"@id/layoutlinear" android1layout3margin5op2"90p)" 4 .5able+ow android1background2"+0000,,"4 .5e0t*iew android1layout3column2"1" android1te0t2"0esto 1" android1gravity2"le t" /4 .5e0t*iew android1te0t2"0esto 8" android1gravity2"right" /4 ./5able+ow4 .5able+ow android1background2"+,,0000"4 .5e0t*iew android1layout3column2"1" android1te0t2"0esto 9" android1gravity2"le t" /4 .5e0t*iew android1te0t2"0esto B" android1gravity2"right" /4 ./5able+ow4 ./5able/ayout4 ./+elative/ayout4
'l codice non molto complesso, anc"e se per la,out ben pi6 grandi di questo proposto, si possono utilizzare altre metodologie non illustrate in questa guida. +ando una occ"iata al codice, si nota c"e il la,out manager principale di tipo Relati!eLa,out ed al suo interno sono stati inglobati consecuti!amente LinearLa,out e TableLa,out, quindi in ondo non poi cosE complicato questo esempio$
Risultato
=ardware
Sensor
'l sensore un dispositi!o "ardware c"e con!erte una grandezza isica, come la temperatura o la gra!it2, in un'in ormazione digitale. ?uello c"e aremo noi in questo esempio, caricare la lista dei sensori e iltrarne solo uno e leggerne le in ormazioni.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1id 2 "@(id/t)tsensore" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
'l la,out contiene solo una Te*t5iew do!e !isualizzeremo le coordinate dell'accelerometro. 'l codice non ar2 altro c"e !isualizzare la lista dei sensori presenti sul dispositi!o e successi!amente iltrare l'accelerometro.
public class (ensorEroHectActivity ex%ends Activity implemen%s (ensor=vent/istener priva%e (ensorManager manager; priva%e (ensor s3acc 2 null; priva%e 5e0t*iew t0tsens; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tsens 2 &5e0t*iew) find*iewBy'd&+.id.t)tsensore); manager 2 &(ensorManager) get(ystem(ervice&"onte0t..34.6:_.3:A?13); /ist.(ensor4 list(ensor 2 manager.get(ensor/ist&(ensor.0C73_A22); for &(ensor stemp 1 list(ensor) 5oast.make0e)t&%*is- stemp.getGame&)- 5oast.23450&_2645).show&); , for &(ensor stemp 1 list(ensor) s'i%c*&stemp.get5ype&)) case (ensor.0C73_A11323:6M303:1 s3acc 2 stemp; brea$; , , if&s3acc 92 null) manager.register/istener&%*is- s3acc- (ensorManager..34.6:_D32AC_46:MA2); , $%verride public void onAccuracy"hanged&(ensor arg?- in% arg>) , $%verride public void on(ensor"hanged&(ensor=vent arg?) floa%:; valori 2 arg?.values; (tring testo 2 <(ensore1 < O arg?.sensor.getGame&) O <PnQ1 < O valori:?; O <PnK1 < O valori:>; O <PnR1 < O valori:@;; s'i%c*&arg?.sensor.get5ype&)) case (ensor.0C73_A11323:6M303:1 t0tsens.set5e0t&testo); brea$; , ,
Tramite l'oggetto "ensor&anager andiamo a ric"iamare tutti i sensori manager.get(ensor/ist&(ensor.0C73_A22) , possibile anc"e ric"iamare solo un tipo di sensori cambiando l'argomento%
(ensor.0C73_A113223:6M303:E accelerometro .ensor.0C73_5C:6.1673E giroscopio .ensor.0C73_2?5&0E luce .ensor.0C73_MA5430?1_,?32DE magnetico .ensor.0C73_7:3..@:3E pressione .ensor.0C73_7:6F?M?0CE prossimitG .ensor.0C73_03M73:A0@:3E temperatura
Sensor.TSP#RALL, tutti +urante l'e!ento on"ensor1*anged andremo a iltrare il nostro sensore e !isualizzeremo nella Te*t5iew le coordinate registrate.
&ouc*
'l touc"screen un !ero e proprio sensore c"e rile!a la pressione di un oggetto sulla sua super icie. Senza perderci troppo in di erenze quali resisti!o e capaciti!o, andiamo a !edere il nostro esempio, do!e ci ocalizziamo nell'intercettare la pressione di un oggetto su una porzione di sc"ermo.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" android1id2"@(id/layout1" 4 .5e0t*iew android1id2"@(id/t)tdown" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/down" /4 .5e0t*iew android1id2"@(id/t)tup" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/up" /4 .5e0t*iew android1id2"@(id/t)tmove" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/move" /4 ./inear/ayout android1id2"@(id/layout8" android1layout3width2" ill_parent" android1layout3height2"100dp" android1background2"+0000,," 4.//inear/ayout4 .//inear/ayout4
&el la,out andiamo a creare due zone con la,out manager di tipo linear% la prima ser!ir2 a mostrarci le in ormazioni riguardo gli e!enti di pressione, rilascio e mo!imento del sensore touc", la seconda sar2 la porzione di sc"ermo do!e !erranno intercettati gli e!enti.
public class 5ouchEroHectActivity ex%ends Activity implemen%s %n5ouch/istener /SS "alled when the activity is first created. S/ 5e0t*iew t0tdown- t0tup- t0tmove; /inear/ayout layout>- layout@; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tdown 2 &5e0t*iew)find*iewBy'd&+.id.t)tdown); t0tup 2 &5e0t*iew)find*iewBy'd&+.id.t)tup); t0tmove 2 &5e0t*iew)find*iewBy'd&+.id.t)tmove); layout@ 2 &/inear/ayout)find*iewBy'd&+.id.layout8); layout@.set%n5ouch/istener&%*is); , $%verride public boolean on5ouch&*iew v- Motion=vent event) s'i%c*&event.getAction&)) case Motion=vent.A10?64_D6=41 t0tdown.set5e0t&<A"5'%G B%8G1 0 II4 < O event.getQ&) O <- y II4 < O event.getK&)); brea$; case Motion=vent.A10?64_@71 t0tup.set5e0t&<A"5'%G NE1 0 II4 < O event.getQ&) O <- y II4 < O event.getK&)); brea$; case Motion=vent.A10?64_M6A31 t0tmove.set5e0t&<A"5'%G M%*=1 0 II4 < O event.getQ&) O <- y II4 < O event.getK&)); brea$; , re%urn %rue; , ,
)ome !ediamo dall'intestazione della Acti!it,, andiamo ad implementare il listener 3n0ouc*'istener, c"e ci permetter2 di gestire gli e!enti #10I3!/7P HrilascioI, #10I3!/D36! HpressioneI e #10I3!/&3)E Hmo!imentoI generati. 'l listener sar2 assegnato solo al secondo la,out, come si !ede dalla riga
layout@.set%n5ouch/istener&%*is);
'n sostanza, intercetteremo l'e!ento on0ouc* ed andremo a iltrare, secondo le azioni atte, e !isualizzare le relati!e coordinate dello sc"ermo do!e a!!enuto l'e!ento. ' metodi get89: e get;9: ci ser!iranno per rica!are le coordinate.
)ul%i%ouc*
La di erenza nel rile!are uno o pi6 tocc"i sullo sc"ermo quasi irrisoria. Jasta rica!are il numero di punti e ric"iamare le coordinate tramite indice.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" android1id2"@(id/layout1" 4 .5e0t*iew android1id2"@(id/t)tmove1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"A10?64 M6A3 1: " /4 .5e0t*iew android1id2"@(id/t)tmove8" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"A10?64 M6A3 8: " /4 .//inear/ayout4
'l la,out, come al solito, ci ser!e solo per mostrare in ormazioni. Per semplicit2 l'e!ento onTouc" rile!ato in tutto lo sc"ermo.
public class Multi5ouchEroHectActivity ex%ends Activity implemen%s %n5ouch/istener /SS "alled when the activity is first created. S/ 5e0t*iew t0tmove>- t0tmove@; /inear/ayout layout>; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tmove> 2 &5e0t*iew)find*iewBy'd&+.id.t)tmove1); t0tmove@ 2 &5e0t*iew)find*iewBy'd&+.id.t)tmove8); layout> 2 &/inear/ayout)find*iewBy'd&+.id.layout1); layout>.set%n5ouch/istener&%*is); , $%verride public boolean on5ouch&*iew v- Motion=vent event) s'i%c*&event.getAction&)) case Motion=vent.A10?64_M6A31 t0tmove>.set5e0t&<A"5'%G M%*= >1 0 II4 < O event.getQ&?) O <- y II4 < O event.getK&?)); if&event.getEointer"ount&) 4 >) t0tmove@.set5e0t&<A"5'%G M%*= @1 0 II4 < O event.getQ&>) O <- y II4 < O event.getK&>)); brea$; , re%urn %rue; , ,
Le parti di codice interessanti sono event.getEointer"ount&) c"e ci dice quanti tocc"i "a lo sc"ermo e le solite getTHI e getSHI ci ser!iranno a rica!are le coordinate ma, sta!olta, dobbiamo passare l'indice del punto dello sc"ermo da rica!are.
Risultato
-iscellanea, parte 1
7ile
Su Android, la gestione del ile s,stem la stessa di una classica applicazione .a!a. ?uindi, !erranno utilizzate gli oggetti +ile3utput"tream e 3utput"tream6riter per scri!ere, +ileInput"tream e Input"tream4eader per leggere.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/scrivi" /4 .=dit5e0t android1id2"@(id/t)t,ile" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1input5ype2"te)t" /4 .Button android1id2"@(id/-tn1arica" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/carica" /4 .Button android1id2"@(id/-tn.alva" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/salva" /4 .Button android1id2"@(id/-tn1arica.D" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/caricasd" /4 .Button android1id2"@(id/-tn.alva.D" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/salvasd" /4 .//inear/ayout4
'l la,out composto da una casella di testo do!e andremo ad inserire una stringa da memorizzare o c"e !iene letta da ile, ed i pulsanti relati!i al caricamento e sal!ataggio del ile su memoria interna ed esterna HS+I.
public class JileEroHectActivity ex%ends Activity implemen%s %n"lick/istener /SS "alled when the activity is first created. S/ final (tring J'/=GAM= 2 <fileprova.t0t<; final (tring MK3EA56 2 </JileEroHect<; final in% MAQ3BNJ 2 >?@D; =dit5e0t t0tJile; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tJile 2 &=dit5e0t) find*iewBy'd&+.id.t)t,ile); Button btn"arica 2 &Button) find*iewBy'd&+.id.-tn1arica); btn"arica.set%n"lick/istener&%*is); Button btn(alva 2 &Button) find*iewBy'd&+.id.-tn.alva); btn(alva.set%n"lick/istener&%*is); Button btn"arica(B 2 &Button) find*iewBy'd&+.id.-tn1arica.D); btn"arica(B.set%n"lick/istener&%*is); Button btn(alva(B 2 &Button) find*iewBy'd&+.id.-tn.alva.D); btn(alva(B.set%n"lick/istener&%*is); , public boolean caricaJile&(tring pathname) %ry in% read; (tring read( 2 <<; Jile'nput(tream fis 2 openJile'nput&pathname);
'nput(tream+eader isr 2 ne' 'nput(tream+eader&fis); c*ar:; buffer 2 ne' c*ar:MAQ3BNJ;; '*ile&&read 2 isr.read&buffer)) 4 ?) read( O2 (tring.copyAalue6 &buffer- ?- read); buffer 2 ne' c*ar:MAQ3BNJ;; , t0tJile.set5e0t&read(); isr.close&); , ca%c* &=0ception e) 5oast.make0e)t&%*is- e.getMessage&)- 5oast.23450&_.&6:0).show&); re%urn false; , re%urn %rue;
public boolean salvaJile&(tring pathname) %ry Jile%utput(tream fos 2 openJile%utput&pathname- M6D3_7:?AA03); %utput(tream8riter osw 2 ne' %utput(tream8riter&fos); osw.write&t0tJile.get5e0t&).to(tring&)); osw.flush&); osw.close&); t0tJile.set5e0t&<<); , ca%c* &=0ception e) 5oast.make0e)t&%*is- e.getMessage&)- 5oast.23450&_.&6:0).show&); re%urn false; , re%urn %rue; , public boolean caricaJile(B&(tring pathname) %ry in% read; (tring read( 2 <<; Jile pathsd 2 =nvironment.get3)ternal.torageDirectory&); Jile directory 2 ne' Jile&pathsd.getAbsoluteEath&) O MK3EA56); Jile file 2 ne' Jile&directory- pathname); Jile'nput(tream fis 2 ne' Jile'nput(tream&file); 'nput(tream+eader isr 2 ne' 'nput(tream+eader&fis); c*ar:; buffer 2 ne' c*ar:MAQ3BNJ;; '*ile&&read 2 isr.read&buffer)) 4 ?) read( O2 (tring.copyAalue6 &buffer- ?- read); buffer 2 ne' c*ar:MAQ3BNJ;; , t0tJile.set5e0t&read(); isr.close&); , ca%c* &=0ception e) 5oast.make0e)t&%*is- e.getMessage&)- 5oast.23450&_.&6:0).show&); re%urn false; , re%urn %rue; , public boolean salvaJile(B&(tring pathname) %ry Jile pathsd 2 =nvironment.get3)ternal.torageDirectory&); Jile directory 2 ne' Jile&pathsd.getAbsoluteEath&) O MK3EA56); if&9directory.e0ists&)) directory.mkdir&); Jile file 2 ne' Jile&directory- pathname); Jile%utput(tream fos 2 ne' Jile%utput(tream&file); %utput(tream8riter osw 2 ne' %utput(tream8riter&fos); osw.write&t0tJile.get5e0t&).to(tring&)); osw.flush&); osw.close&); t0tJile.set5e0t&<<); , ca%c* &=0ception e) 5oast.make0e)t&%*is- e.getMessage&)- 5oast.23450&_.&6:0).show&); re%urn false; , re%urn %rue; , $%verride public void on"lick&*iew arg?) s'i%c*&arg?.get'd&)) case +.id.-tn1arica1 caricaJile&J'/=GAM=); brea$; case +.id.-tn.alva1
, ,
salvaJile&J'/=GAM=); brea$; case +.id.-tn1arica.D1 caricaJile(B&J'/=GAM=); brea$; case +.id.-tn.alva.D1 salvaJile(B&J'/=GAM=); brea$; ,
' metodi cruciali sono carica+ile, salva+ile, carica+ile"D e salva+ile"D. Scri!ere o leggere da memoria interna o esterno non cambia il codice, tranne per il atto di andarsi a rica!are il percorso della memoria esterna H=nvironment.get3)ternal.torageDirectoryHII. carica@ile e carica@ileS+ tramite 'nputStreamReader leggono il contenuto del ile Hb,teI e lo con!ertono in ormato stringa, cosE lo possiamo !isualizzare senza problemi nella nostra casella di testo. sal!a@ile e sal!a@ileS+ anno l'operazione in!ersa rispetto le precedenti, o!!ero tramite (utputStreamMriter scri!ono la stringa presente nella casella di testo su ile. &ecessitiamo sempre di un permesso, in questo caso android.permission.=:?03_3F03:4A2_.06:A53 per scri!ere su memoria esterna.
.usesIpermission android1name2"android.permission.=:?03_3F03:4A2_.06:A53"/4
Risultato
)ail
Analizziamo come in!iare una semplice mail, s ruttando i gestori di posta elettronica interni al nostro sistema operati!o.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .=dit5e0t android1id2"@(id/t)tdest" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1hint2"@string/dest" /4 .=dit5e0t android1id2"@(id/t)togg" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1hint2"@string/ogg" /4 .=dit5e0t android1id2"@(id/t)ttesto" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1hint2"@string/mess" /4 .Button android1id2"@(id/-tninvia" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/invia" /4 .//inear/ayout4
'l la,out composto dal minimo indispensabile per in!iare una mail% destinatario, oggetto e testo.
public class MailEroHectActivity ex%ends Activity implemen%s %n"lick/istener /SS "alled when the activity is first created. S/ =dit5e0t t0tdest- t0togg- t0ttesto; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tdest 2 &=dit5e0t)find*iewBy'd&+.id.t)tdest); t0togg 2 &=dit5e0t)find*iewBy'd&+.id.t)togg); t0ttesto 2 &=dit5e0t)find*iewBy'd&+.id.t)ttesto); Button btninvia 2 &Button) find*iewBy'd&+.id.-tninvia); btninvia.set%n"lick/istener&%*is); $%verride public void on"lick&*iew v) 'ntent imail 2 ne' 'ntent&'ntent.A10?64_.34D); imail.put=0tra&'ntent.3F0:A_3MA?2- ne' (tring:; t0tdest.get5e0t&).to(tring&),); imail.put=0tra&'ntent.3F0:A_.@>H310- t0togg.get5e0t&).to(tring&)); imail.put=0tra&'ntent.3F0:A_03F0- t0ttesto.get5e0t&).to(tring&)); imail.set5ype&<message/rfcT@@<); startActivity&'ntent.create1hooser&imail- <=mail<)); , ,
'l metodo on)lick, generato alla pressione del tasto di in!io, non ar2 altro c"e prendere i dati inseriti dall'utente e passarli come parametri ad una applicazione esterna. ?uest'ultima non altro c"e un gestore di posta elettronica e c"e pro!!eder2 in automatico a caricare i dati ed a darci la possibilit2 di in!iare la mail.
Risultato
)enu
&el sistema operati!o Android possibile utilizzare due tipi di menu% 1onte.t &enu e 3ption &enu. L'(ption -enu non altro c"e il menu dell'applicazione ed possibile utilizzarlo cliccando il tasto in alto a destra del nostro sistema o il tasto menu. 'l )onte*t -enu il menu generato da un controllo acendo pressione continua per qualc"e secondo su di esso.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1id2"@(id/t)tmenuoption" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/menu1" /4 .5e0t*iew android1id2"@(id/t)tmenuconte)t" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/scegli" /4 .//inear/ayout4
&el la,out sono presenti due etic"ette di testo c"e ser!iranno a !isualizzare la scelta atta tramite i due tipi di menu.
public class MenuEroHectActivity ex%ends Activity 5e0t*iew t0top; 5e0t*iew t0tco; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0top 2 &5e0t*iew) find*iewBy'd&+.id.t)tmenuoption); t0tco 2 &5e0t*iew) find*iewBy'd&+.id.t)tmenuconte)t); t0tco.set%n"reate"onte0tMenu/istener&%*is);
$%verride public boolean on"reate%ptionsMenu&Menu menu) Menu'nflater inflater 2 getMenu'nflater&); inflater.inflate&+.menu.menu_op- menu); re%urn %rue; , $%verride public boolean on%ptions'tem(elected&Menu'tem item) t0top.set5e0t&item.get5itle&)); re%urn %rue; , $%verride public void on"reate"onte0tMenu&"onte0tMenu menu- *iew view- "onte0tMenu'nfo menu'nfo) Menu'nflater inflater 2 getMenu'nflater&); inflater.inflate&+.menu.menu_co- menu); , $%verride public boolean on"onte0t'tem(elected&Menu'tem item) t0tco.set5e0t&item.get5itle&)); re%urn %rue; ,
Per creare i menu basta interagire con i metodi on1reate1onte.t&enu e on1reate3ptions&enu. Tramite l'oggetto &enuInflater, andremo a caricare il nostro menu creato tramite risorse e lo
assegner2 all'oggetto menu predestinato tramite il metodo inflate Hcontesto o controlloI. ?uando !iene ric"iamato on)reate(ptions-enu il menu !iene assegnato indirettamente all'acti!it,, in!ece, per il menu del controllo, bisogna indicarlo esplicitamente durante il metodo on)reate%
t0tco.set%n"reate"onte0tMenu/istener&%*is);
La precedente riga non a altro c"e assegnare al controllo etic"etta di testo il menu di tipo )onte*t. Si scelto il listener interno Ht"isI, nel caso di pi6 elementi con di!ersi menu, bisogner2 iltrare secondo i controlli, sia per la creazione sia per gli elementi. 'n alternati!a possibile utilizzare dei listener anonimi creati adG"oc. Tramite i ile di risorse posti su NresNmenuN andiamo a creare gli elementi contenuti nei due menu. 'l risultato qualcosa di simile%
.70ml version2"1.0" encoding2"ut !""74 .menu 0mlns1android2"http://schemas.android.com/apk/res/android" 4 .item android1id2"@(id/item1" android1title2"Menu 1onte)t 1"4./item4 .item android1id2"@(id/item8" android1title2"Menu 1onte)t 8"4./item4 .item android1id2"@(id/item9" android1title2"Menu 1onte)t 9"4./item4 ./menu4 .70ml version2"1.0" encoding2"ut !""74 .menu 0mlns1android2"http://schemas.android.com/apk/res/android" 4 .item android1id2"@(id/item1" android1title2"Menu 6ption 1"4./item4 .item android1id2"@(id/item8" android1title2"Menu 6ption 8"4./item4 .item android1id2"@(id/item9" android1title2"Menu 6ption 9"4./item4 ./menu4
Risultato
&ab Ac%ionBar
La nostra ActionJar, oltre alla possibilit2 di inserire pulsanti, etic"ette, menu e !arie altri componenti, possiamo impostarla per proporre un aspetto tabellare alla nostra applicazione. ?uesto tipo di impostazione, sostituisce quella precedente basata sulle 0a(#ctivit$ ormai deprecate dalla !ersione 1O delle AP'. Lasciamo !uoto il la,out dell'acti!it, principale
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2" ill_parent"4 .//inear/ayout4
...ed il secondo
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2"match_parent" android1layout3height2"match_parent" android1orientation2"vertical" 4 .5e0t*iew android1id2"@(id/t)tta-8" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1gravity2"center" android1te0t2"@string/tta-8" /4 .//inear/ayout4
+urante l'e!ento on)reate della nostra acti!it,, andremo a caricare la nostra ActionJar e la imposteremo per la na!igazione a pagine. Successi!amente, inseriremo le nostre pagine caricandole attra!erso i +ragment, o!!ero porzioni di inter accia gra ica in una Acti!it,.
public class 5ab8idgetEroHectActivity ex%ends Activity /SS "alled when the activity is first created. S/ $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); ActionBar bar 2 getActionBar&); bar.setGavigationMode&ActionBar.4AA?5A0?64_M6D3_0A>.); 5ab tab> 2 bar.new5ab&); tab>.set5e0t&<5ab ><); tab>.set5ab/istener&ne' 5ab/istener.5ab>Jragment4&%*is- <5ag 5ab ><- 5ab>Jragment.class)); bar.add5ab&tab>); 5ab tab@ 2 bar.new5ab&);
tab@.set5e0t&<5ab @<); tab@.set5ab/istener&ne' 5ab/istener.5ab@Jragment4&%*is- <5ag 5ab @<- 5ab@Jragment.class)); bar.add5ab&tab@); , priva%e class 5ab/istener.5 ex%ends Jragment4 implemen%s ActionBar.5ab/istener priva%e priva%e priva%e priva%e Jragment mJrag; Activity mAct; (tring m5ag; "lass.54 m"lass;
public 5ab/istener&Activity activity- (tring tag- "lass.54 cls) mAct 2 activity; m5ag 2 tag; m"lass 2 cls; , $%verride public void on5ab+eselected&5ab tab- Jragment5ransaction ft) , $%verride public void on5ab(elected&5ab tab- Jragment5ransaction ft) if&mJrag 22 null) mJrag 2 Jragment.instantiate&mAct- m"lass.getGame&)); ft.add&android.+.id.content- mJrag- m5ag); , else ft.attach&mJrag); , , $%verride public void on5abNnselected&5ab tab- Jragment5ransaction ft) if&mJrag 92 null) ft.detach&mJrag); , , , ,
'l TabListener ser!e ad intercettare gli e!enti relati!i alla selezione, riselezione e deselezione di una pagina e ser!iranno per caricare i nostri @ragment. Le due successi!e classi rappresentano le due pagine !ere e proprie, ciascuna con il proprio la,out opportunamente caricato tramite 'a$outInflater.
public class 5ab>Jragment ex%ends Jragment $%verride public *iew on"reate*iew&/ayout'nflater inflater- *iewCroup container- Bundle saved'nstance(tate) re%urn inflater.inflate&+.layout.ta-1- container- false); , , public class 5ab@Jragment ex%ends Jragment $%verride public *iew on"reate*iew&/ayout'nflater inflater- *iewCroup container- Bundle saved'nstance(tate) re%urn inflater.inflate&+.layout.ta-8- container- false); , ,
Risultato
)edia3layer
'l controllo &ediaPla$er permette di manipolare lussi audioN!ideo. &el nostro esempio ci occuperemo solo di a!!iare e stoppare un ile audio di tipo -PO.
./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" 0mlns1tools2"http://schemas.android.com/tools" android1layout3width2"match_parent" android1layout3height2"match_parent" android1orientation2"vertical" tools1conte0t2".MainActivity" 4 .Button android1id2"@(id/-tnstart" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/start" android1on"lick2"startMusic" /4 .Button android1id2"@(id/-tnstop" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/stop" android1on"lick2"stopMusic" /4 .//inear/ayout4
'l la,out si compone semplicemente di due pulsanti, atti allo start e stop del ile audio.
public class MainActivity ex%ends Activity MediaElayer player; $%verride pro%ec%ed void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.activity_main); player 2 null; , public void startMusic&*iew view) stopMusic&view); player 2 MediaElayer.create&%*is- +.raw.capetown); player.start&); , public void stopMusic&*iew view) if&player 92 null) player.stop&); , ,
'l codice abbastanza semplice e non si a altro c"e, nel metodo start&usic, creare il controllo -ediaPla,er, passando come parametro il ile da riprodurre, ed a!!iare la riproduzione, e nel metodo stop&usic di ermare la riproduzione.
#sempio
S-S e c"iamate
/nvio S)S
'n questo esempio, !edremo come in!iare un semplice sms.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .=dit5e0t android1id2"@(id/t)tnum-er" android1layout3width2" ill_parent" android1input5ype2"num-er" android1layout3height2"wrap_content" android1hint2"@string/dest" /4 .=dit5e0t android1id2"@(id/t)tte)t" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1hint2"@string/testo" /4 .Button android1id2"@(id/-tninvia" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/invia" /4 .//inear/ayout4
Alla pressione del pulsante, caric"eremo "ms&anager del nostro dispositi!o ed in!ieremo un sms tramite il metodo send0e.t&essage, passando gli opportuni parametri.
.usesIpermission android1name2"android.permission..34D_.M."/4
+a non dimenticare di inserire il permesso di in!iare sms nel ile Android-ani est.*ml.
#sempio
'l successi!o la,out ser!ir2 a mostrare gli elementi della lista dell'acti!it,. (gni elemento conterr2 il numero come intestazione seguito dal testo del sms.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2"match_parent" android1layout3height2"match_parent" android1orientation2"vertical" 4 .5e0t*iew android1id2"@(id/t)tnumero" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t"olor2"+,,,,00" /4 .5e0t*iew android1id2"@(id/t)tsms" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
La parte cruciale del codice il metodo #ggiorna'ista c"e pro!!eder2, tramite un cursore, ad e ettuare un'interrogazione nel database degli sms e recuperare quelli solo c"e sono stati selezionati.
public class (M(JolderEroHectActivity ex%ends Activity (tring:; valori3folder 2 <content1//sms/<- <content1//sms/inbo0<- <content1//sms/sent<,;
$%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); (pinner folder 2 &(pinner) find*iewBy'd&+.id. older); ArrayAdapter."har(e#uence4 aadapter 2 ArrayAdapter.create,rom:esource&%*is+.array. oldersms- android.+.layout.simple_spinner_item); aadapter.setBropBown*iew+esource&android.+.layout.simple_spinner_dropdown_item); folder.setAdapter&aadapter); folder.set%n'tem(elected/istener&ne' %n'tem(elected/istener&) $%verride public void on'tem(elected&Adapter*iew.74 arg?- *iew arg>in% arg@- long argA) Aggiorna/ista&arg@); , $%verride public void onGothing(elected&Adapter*iew.74 arg?) , ,); ,
priva%e void Aggiorna/ista&in% id) /ist*iew lista 2 &/ist*iew) find*iewBy'd&+.id.listsms); lista.setAdapter&null); (tring:; colonne 2 ne' (tring:; <address<- <body<- <3id<,; in%:; nomi 2 ne' in%:; +.id.t)tnumero- +.id.t)tsms,; "ursor c; "ontent+esolver cr 2 %*is.get"ontent+esolver&); c 2 cr.#uery&Nri.parse&valori3folder:id;)- colonne- null- null- null); /istAdapter adapter 2 ne' (imple"ursorAdapter&%*is- +.layout.sms_layout- c- colonne- nomiAdapter.46_.32310?64); lista.setAdapter&adapter); , , c.close&);
'l 1ursor un controllo c"e ser!e per manipolare una base di dati, come quella degli sms o della rubrica. Ricordarsi di includere i permessi per leggere gli sms.
.usesIpermission android1name2"android.permission.:3AD_.M."/4
Risultato
Effe%%uare (*iama%a
Per e ettuare una c"iamata utilizzeremo banalmente l'applicazione interna o erta dal nostro dispositi!o.
./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" 0mlns1tools2"http://schemas.android.com/tools" android1layout3width2"match_parent" android1layout3height2"match_parent" android1orientation2"vertical" tools1conte0t2".MainActivity" 4 .=dit5e0t android1id2"@(id/t)tnumero" android1layout3height2"wrap_content" android1layout3width2" ill_parent" android1hint2"@string/numero" /4 .Button android1id2"@(id/-tncall" android1layout3height2"wrap_content" android1layout3width2" ill_parent" android1te0t2"@string/call" android1on"lick2"1hiama" /4 .//inear/ayout4
La parte importante dell'esempio il metodo 1*iama% rica!a il numero dal campo di testo ed e ettua la c"iamata tramite l'applicazione interna del sistema.
public void "hiama&*iew view) =dit5e0t t0tnumero 2 &=dit5e0t)%*is.find*iewBy'd&+.id.t)tnumero); 'ntent intent 2 ne' 'ntent&'ntent.A10?64_1A22); intent.setBata&Nri.parse&<tel1< O t0tnumero.get5e0t&).to(tring&))); startActivity&intent); ,
#sempio
/n%erce%%are c*iama%a
Per intercettare una c"iamata dobbiamo utilizzare sempre il solito listener, in questo caso P*one"tate'istener )ome dice il nome, ser!ir2 ad intercettare un cambiamento nello stato del tele ono.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1id2"@(id/t)tcall" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"" /4 .//inear/ayout4
'l la,out, sempre di appoggio, composto da una etic"etta di testo per !isualizzare il numero della c"iamata rice!uta.
public class "allEroHectActivity ex%ends Activity 5e0t*iew t0tcall; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tcall 2 &5e0t*iew) find*iewBy'd&+.id.t)tcall); 5elephonyManager tmanager 2 &5elephonyManager) get(ystem(ervice&"onte0t.03237&64C_.3:A?13); tmanager.listen&ne' "all/istener&)- "all/istener.2?.034_1A22_.0A03); , class "all/istener ex%ends Ehone(tate/istener $%verride public void on"all(tate"hanged&in% state- (tring number) super.on"all(tate"hanged&state- number); s'i%c*&state) case 5elephonyManager.1A22_.0A03_:?45?451 t0tcall.set5e0t&<"hiamata ricevuta da < O number); , , , ,
La parte di codice di analizzare quella relati!a al 1all'istener, un oggetto P"oneStateListener, c"e ser!ir2 ad intercettare, tramite l'e!ento on1all"tate1*anged, se a!!iene un cambiamento di stato. ?uando !err2 intercettato uno stato 1#''/"0#0E/4I!5I!5, signi ica c"e stiamo rice!endo una c"iamata. 'l numero della c"iamata argomento dell'e!ento on)allState)"anged e lo !isualizzeremo a !ideo. Anc"e qui ci !orr2 un permesso per poter leggere lo stato del tele ono.
.usesIpermission android1name2"android.permission.:3AD_7&643_.0A03"/4
3na particolarit2 del plugin Android dell'ambiente #clipse quella di poter e ettuare inte c"iamate o in!iare inti sms, con Emulator1ontrol, in modo da poter testare con acilit2 le applicazioni sulla macc"ina !irtuale Android.
Se non presente, basta andarlo a selezionare da Mindows Q S"ow 5iew Q (t"er. &ella lista c"e comparir2 ci sar2 il suddetto componente. #sempio
)oncetti a!anzati
Ser!ice T"reading
Service
3n "ervice un insieme di operazioni, a corta o lunga durata, c"e !engono eseguite da una applicazione senza necessit2 dell'iterazione con l'utente. 3tilizzato spesso per espletare unzioni autonome con la possibilit2 di iterazione attra!erso un applicati!o di appoggio. &el nostro la,out sono stati predisposti due pulsanti c"e ser!iranno ad a!!iare e arrestare il ser!izio.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Button android1id2"@(id/-tnstart" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/start" /4 .Button android1id2"@(id/-tnstop" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/stop" /4 .//inear/ayout4
' metodi per a!!iare e arrestare un ser!izio, anno parte della classe Acti!it, e sono rispetti!amente start"ervice e stop"ervice.
public class (erviceEroHectActivity ex%ends Activity implemen%s %n"lick/istener /SS "alled when the activity is first created. S/ $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); Button btnstart 2 &Button) find*iewBy'd&+.id.-tnstart); btnstart.set%n"lick/istener&%*is); Button btnstop 2 &Button) find*iewBy'd&+.id.-tnstop); btnstop.set%n"lick/istener&%*is); , $%verride public void on"lick&*iew arg?) s'i%c*&arg?.get'd&)) case +.id.-tnstart1 start(ervice&ne' 'ntent&getBase"onte0t&)- (ervice5est.class)); brea$; case +.id.-tnstop1 stop(ervice&ne' 'ntent&getBase"onte0t&)- (ervice5est.class)); brea$; , ,
L'oggetto ser!izio c"e andremo a creare molto banale ed il suo compito solo indicarci con una noti ica, quando il ser!izio !iene a!!iato e quando !iene distrutto. L'e!ento c"e !iene generato quando !iene a!!iato il ser!izio on"tart1ommand, quando !iene distrutto onDestro$.
public class (ervice5est ex%ends (ervice public (ervice5est&) , $%verride
public 'Binder onBind&'ntent intent) re%urn null; , $%verride public in% on(tart"ommand&'ntent intent- in% flags- in% start'B) 5oast.make0e)t&%*is- <(ervizio avviato<- 5oast.23450&_2645).show&); re%urn .0A:0_.0?1IC; , $%verride public void onBestroy&) super.onBestroy&); 5oast.make0e)t&%*is- <(ervizio distrutto<- 5oast.23450&_2645).show&); , ,
Risultato
&*reading
L'argomento 0*reading molto !asto, qui ci occuperemo di !edere in maniera super iciale alcuni dei costrutti c"e ci o re il nostro sistema Android. 3tilizzeremo tre modi per e ettuare t"read% #s$nc0ask, 4unna(le e Handle. La nostra Acti!it, sar2 composta da tre pulsanti, ciascuno eseguir2 uno dei tre metodi sopracitati.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Button android1on"lick2"on1lickAsync0ask" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/async" /4 .Button android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1on"lick2"on1lick:unna-le" android1te0t2"@string/run" /4 .Button android1on"lick2"on1lick&andle" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/han" android1id2"@(id/-tnh" /4 .//inear/ayout4
?uando sar2 selezionato As,ncTask !err2 creata una istanza della nostra classe 0est#s$nc0ask, eseguir2 un processo parallelo c"e pro!!eder2 ad aggiornare il suo stato di a!anzamento ed a !isualizzarlo a !ideo. Alla selezione di Runnable, !err2 creata una classe anonima interna Hclasse senza identi icatoreI c"e pro!!eder2 anc"'essa ad aggiornare il suo stato ed a !isualizzarlo a !ideo. L'oggetto =andler pro!!eder2 a lanciare un messaggio, nella coda dei messaggi del t"read corrente, c"e modi ic"er2 lo stato del pulsante. 3tilizzato solitamente in combinazione con oggetti Runnable, in quanto potrebbe bloccare il t"read principale.
public class 5hreadingEroHectActivity ex%ends Activity Button btnh; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); btnh 2 &Button) find*iewBy'd&+.id.-tnh); , public void on"lickAsync5ask&*iew view) 5estAsync5ask task 2 ne' 5estAsync5ask&getBase"onte0t&)); task.e0ecute&<*alore ><- <*alore @<- <*alore A<); , public void on"lick+unnable&*iew view) final Button btnr 2 &Button)view; ne' 5hread&ne' +unnable&) $%verride public void run&) %ry btnr.post&ne' +unnable&)
$%verride public void run&) btnr.set5e0t&<=secuzione...<); , ,); 5hread.sleep&A???); btnr.post&ne' +unnable&) $%verride public void run&) btnr.set5e0t&<+unnable<); , ,); , ca%c* &'nterrupted=0ception e) , , ,).start&); ,
6andler handler 2 ne' 6andler&) $%verride public void handleMessage&Message msg) (tring testo 2 ne' (tring&&by%e:;)msg.obH); btnh.set5e0t&testo); /og.d&<5esto<- testo); , ,; public void on"lick6andle&*iew view) Message.o-tain&handler- view.get'd&)(tring.value6 &<=secuzione...<).getBytes&)).send5o5arget&); , ,
+a notare c"e !engono utilizzati ulteriori Runnable per aggiornare lo stato dei pulsanti, ci4 do!uto a problemi di cross t*read safe, un determinato t"read non pu4 modi icare !alori ri eriti ad un altro t"read. La nostra classe TestAs,ncTask non ar2 altro c"e eseguire un processo in background tramite il metodo do'nBackground&(tring... arg?) e, nel nostro esempio, l'abbiamo utilizzato passandogli delle string"e come parametri, ogni stringa pubblic"er2 lo stato di a!anzamento HpublishErogressI rispetto al numero totale delle string"e. (gni qual!olta !iene aggiornato lo stato di a!anzamento !err2 stampato un messaggio a !ideo con la relati!a percentuale Hmetodo onErogressNpdate&'nteger... progress)I.
public class 5estAsync5ask ex%ends Async5ask.(tring- 'nteger- /ong4 priva%e "onte0t conte0t; public 5estAsync5ask&"onte0t conte0t) %*is.conte0t 2 conte0t; , $%verride pro%ec%ed /ong do'nBackground&(tring... arg?) %ry for&in% i2?; i.arg?.length; iOO) publishErogress&&in%)&&&floa%)&iO>)/&floa%)arg?.length)S>??)); , , ca%c* &=0ception e) , re%urn null;
pro%ec%ed void onEost=0ecute&/ong result) (tampaMessaggio&<Jinito9<); , priva%e void (tampaMessaggio&(tring str) 5oast.make0e)t&conte0t- str- 5oast.23450&_.&6:0).show&); , ,
Risultato
-iscellanea, parte /
3assaggio di parame%ri
'n questo esempio analizzeremo un metodo per passare parametri a di!erse acti!it, di uno stesso progetto. Solitamente, si utilizza Jundle c"e ci permette di mappare tramite c"ia!eN!alore per conser!are e recuperare dati. 'n questo caso utilizzeremo direttamente gli Intent delle Acti!it, per recuperare dei parametri e*tra.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .Button android1id2"@(id/-tndati" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/dati" /4 .//inear/ayout4
&el la,out della prima Acti!it, presente un pulsante c"e, una !olta cliccato, pro!!eder2 a ric"iamare la seconda Acti!it, tramite 'ntent, passando una stringa come parametro e*tra.
public class BundleEroHectActivity ex%ends Activity implemen%s %n"lick/istener /SS "alled when the activity is first created. S/ $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); Button btntesto 2 &Button) find*iewBy'd&+.id.-tndati); btntesto.set%n"lick/istener&%*is); , $%verride public void on"lick&*iew arg?) if&arg?.get'd&) 22 +.id.-tndati) 'ntent intent 2 ne' 'ntent&%*is- Activity@.class); intent.put=0tra&<(tringa><- <5esto ><); startActivity&intent); , , ,
'l la,out della seconda acti!it, conterr2 una etic"etta di testo c"e ser!ir2 a !isualizzare la stringa passata dall'acti!it, precedente.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2"match_parent" android1layout3height2"match_parent" android1orientation2"vertical" 4 .5e0t*iew android1id2"@(id/t)tdati" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4
public class Activity@ ex%ends Activity $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main8); 5e0t*iew t0t5esto 2 &5e0t*iew) find*iewBy'd&+.id.t)tdati); 'ntent intent 2 get'ntent&); t0t5esto.set5e0t&intent.get(tring=0tra&<(tringa><)); ,
Ric"iamando l''ntent della seconda Acti!it,, possibile recuperare il !alore passato come parametro e*tra tramite la sua c"ia!e, nel nostro caso BStringa1D
2rid!ie'/con
7iusto per mettere un po' di pepe, proponiamo un esempio di 7rid5iew un po' pi6 complesso. &ella nostra griglia, in!ece di !isualizzare solo delle etic"ette di testo, creeremo un la,out custom composto da una icona e da un testo. &el nostro la,out principale piazzeremo la nostra 7rid5iew.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1orientation2"vertical" 4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/sel" /4 .Crid*iew android1id2"@(id/grid1" android1layout3width2" ill_parent" android1layout3height2"match_parent" android1num"olumns2"8" android1column8idth2"<0dp" android1gravity2"center_hori*ontal" /4 .//inear/ayout4
?uando !err2 generato l'e!ento on)reate della nostra Acti!it,, assoceremo il nostro la,out custom tramite un #dapter creato adG"oc H'mageAdapterI.
public class Crid*iew'conActivity ex%ends Activity /SS "alled when the activity is first created. S/ priva%e Crid*iew griglia; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); griglia 2 &Crid*iew)find*iewBy'd&+.id.grid1); griglia.setAdapter&ne' 'mageAdapter&%*is)); ,
+i seguito mostriamo il nostro la,out personalizzato nella quale presente una immagine ed una etic"etta di testo. (gni elemento della 7rid5iew a!r2 questo tipo di la,out.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1id2"@(id/itemgrid" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1orientation2"vertical" android1gravity2"center_hori*ontal" android1background2"+00;;,," 4 .'mage*iew android1id2"@(id/imgitem" android1layout3width2"wrap_content" android1layout3height2"wrap_content" /4 .5e0t*iew android1id2"@(id/t)titem" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t2"testo di prova" android1gravity2"center_hori*ontal" android1te0t"olor2"+000000" /4 .//inear/ayout4
'l nostro Adapter sar2 un'estensione di un 2ase#dapter HAdapter di baseI e ser!ir2 a costruire il
la,out personalizzato ed assegnare anc"e un e!ento on)lick quando !iene selezionato l'elemento.
public class 'mageAdapter ex%ends BaseAdapter priva%e Activity sActivity; public 'mageAdapter&Activity sActivity) %*is.sActivity 2 sActivity; , $%verride public in% get"ount&) re%urn T; , $%verride public %bHect get'tem&in% arg?) re%urn null; , $%verride public long get'tem'd&in% arg?) re%urn ?; , public *iew get*iew&in% arg?- *iew arg>- *iewCroup arg@) *iew view 2 arg>; if&view 22 null) /ayout'nflater li 2 sActivity.get/ayout'nflater&); view 2 li.inflate&+.layout.itemgrid- null); final 5e0t*iew t0t 2 &5e0t*iew)view.find*iewBy'd&+.id.t)titem); t0t.set5e0t&<=lemento1 < O arg?); 'mage*iew img 2 &'mage*iew)view.find*iewBy'd&+.id.imgitem); img.set'mage+esource&+.drawable.ic_launcher); view.set%n"lick/istener&ne' %n"lick/istener&) $%verride public void on"lick&*iew arg?) 5oast.make0e)t&sActivity- t0t.get5e0t&)5oast.23450&_.&6:0).show&); , ,); , re%urn view; , ,
?uando sar2 selezionato un elemento della griglia, !err2 !isualizzata su sc"ermo una noti ica con l'etic"etta di testo dell'elemento.
Risultato
#idge%
' 6idget sono dei contenitori gra ici c"e !engono posizionati ed utilizzati sulla "ome o su una delle sue pagine. Adoperati per mettere in rilie!o in ormazioni importanti o comunicazioni di !ario tipo, come il meteo, aggiornamenti mail, orologio e !arie. L'input abbastanza limitato ed i controlli c"e si possono inserire sono poc"i, esclusi anc"e #ditTe*t et similia.
public class 8idgetEroHectActivity ex%ends App8idgetErovider ,
Primissima di erenza con un'applicazione normale la classe a cui si a ri erimento% in!ece della solita Acti!it, si utilizzer2 AppMidgetPro!ider. Per la costruzione del la,out nulla cambia, eccetto la limitazione sul numero di controlli disponibili.
.70ml version2"1.0" encoding2"ut !""74 ./inear/ayout 0mlns1android2"http://schemas.android.com/apk/res/android" android1orientation2"vertical" android1layout3width2" ill_parent" android1layout3height2" ill_parent" android1gravity2"center" android1background2"+0011,," 4 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t"olor2"+000000" android1te0t2"0e)tAiew" android1padding/eft2"18p)" /4 .//inear/ayout4
Aspetto importante dic"iarare il pro!ider per utilizzare il Midget, in un ile separato nella cartella NresN*mlN. &el mio caso l'"o c"iamato widgetRpro!ider.*ml .
.70ml version2"1.0" encoding2"ut !""74 .appwidgetIprovider 0mlns1android2"http://schemas.android.com/apk/res/android" android1updateEeriodMillis2"10000" android1initial/ayout2"@layout/main" android1min8idth2"1B;dip" android1min6eight2"J8dip" /4
7li attributi min6idt* e minHeig*t de iniscono le misure minime del Midget. +a ricordare c"e lo sc"ermo di!iso in blocc"i da U8dp, e solitamente le misure si decidono come multipli di U8dpG/dp, per permettere di are bordi particolari o margini, come gli angoli arrotondati.
#sempio
1onclusione
)osa aspettarmi da questa guidaC Je", sinceramente, spero in molti commenti sia positi!i sia negati!i. #' importante sapere cosa la comunit2 di s!iluppatori pensa del tuo la!oro% migliorarsi< sempre tendere a migliorarsi< Ribadisco c"e questa guida solo una introduzione, se qualcosa non c"iaro sar4 disponibile al mio indirizzo di posta elettronica pietroalberto.rossiVgmail.com .