Sei sulla pagina 1di 104

Android by Example

v4.2 JellyBean

Rossi Pietro Alberto

Sorgenti scaricabili dal sito www.sprik.it

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

Programmazione ad oggetti Programmazione !isuale Programmazione ad e!enti

Introduzione alla programmazione ad oggetti


?uando iniziamo a realizzare un programma, sia di 10 rig"e sia di 100 mila rig"e, a primo impatto andiamo a cercare una soluzione al nostro problema, pensando principalmente a non a!ere troppe complicazioni man mano c"e si scri!e il codice. @ra le considerazioni iniziali cA sempre la amosa domanda B)"e linguaggio utilizziamoCD. ?uello c"e noi andremo a cercare un paradigma c"e ci permette di risol!ere il problema, nella maniera pi6 semplice possibile. +a qui discende c"e un paradigma un modello comportamentale di programmazione o, pi6 semplicemente, uno stile di programmazione. La scelta del linguaggio di programmazione molto importante, soprattutto se un progetto abbastanza grande. #ssa pu4 deri!are anc"e dal tipo di problema da risol!ere% molti linguaggi dispongono di librerie, gi2 predisposte, c"e sempli icano alcune procedure ritenute ondamentali o soltanto per il semplice scopo di sempli icare la !ita del programmatore. 'l modo di pensare come programmare un applicazione ondamentale. 'n programmazione imperati!a ci mettiamo da!anti il progetto e ci c"iediamo cosa are, issando lAattenzione sullAobietti!o da raggiungere e di come raggiungerlo. 'n programmazione ad oggetti, in!ece, dobbiamo cercare di non personalizzare lAoggetto ma continueremo a pensare lAoggetto cosE come . Penseremo ad un oggetto astratto, cercando di indi!iduare quali sono le caratteristic"e dellAoggetto e le sue potenzialit2. 7li elementi caratteristici sono c"iamati Attributi dellAoggetto, le potenzialit2 sono in!ece c"iamate -etodi. +a notare c"e, molti programmatori, le potenzialit2 dellAoggetto li c"iama erroneamente unzioni% dato c"e possono somigliare parecc"io alle unzioni utilizzate in qualunque linguaggio imperati!o. +urante lAanalisi del problema non importa cosa accia il metodo, lAimportante rispecc"iare le potenzialit2 e successi!amente s!ilupparne il problema. Altro errore c"e spesso si sente lAutilizzo di )lasse e (ggetto come se ossero la stessa cosa% un (ggetto la rappresentazione reale della problematica presa in considerazione, la )lasse in!ece la rappresentazione astratta dellA(ggetto. Per esempio, se consideriamo una penna, essa nella realt2 rappresenta il nostro (ggetto !ero e proprio, cosE come atto% sappiamo c"e una penna, il colore, il tipo, ecc9 La )lasse c"e rappresenter2 la penna sar2, per de inizione, lAastrazione dellA(ggetto. ?ui ci possiamo c"iedere B# cosa cambiaC &on la stessa cosaCD, la risposta parzialmente negati!a perc"F, attra!erso questo processo di astrazione, noi andremo a determinare anc"e altri dettagli supplementari dellA(ggetto% se scri!e o meno, li!ello di inc"iostro, ecc.

Introduzione alla programmazione visuale


'n base alla modalit2 con cui lAutente interagisce con il sistema, le inter acce utente possono essere classi icate in% inter acce testuali ed inter acce gra ic"e. Le inter acce testuali, dette anc"e inter acce a caratteri, le ricordiamo pi6 o meno tutti, come il buon !ecc"io -SG+(S e la s"ell di Linu*. =anno atto la storia dei computer, allAinizio erano tutti ad inter accia testuale, rendendo lAuso stesso del computer poco accessibile al pubblico. Le inter acce gra ic"e sono le odierne inter acce con cui interagiamo. Tutti quei oggetti c"e si muo!ono sullo sc"ermo, "anno migliorato lAuso del computer, rendendolo accessibile a tutti e di usissimo in tutto il mondo. La di erenza principale ra inter accia testuale e !isuale la modalit2 con cui lAutente interagisce con il computer. &el primo caso lAutente interagisce solo con la tastiera, le istruzioni proposte a !ideo possono !ariare nellAaspetto in modo molto limitato, il monitor !iene !isto come una matrice di celle con un determinato numero di rig"e e di colonne e lAinserimento dei dati controllato dal programma. &el secondo caso lAutente interagisce attra!erso !ari strumenti come il mouse e la tastiera, il monitor !isto come una matrice di pi*el caratterizzata da un certo numero di rig"e e di colonne HrisoluzioneI, ogni carattere !isualizzato pu4 a!ere una propria dimensione e un proprio aspetto, il controllo del lusso del programma deciso dallAutente. 'n unAinter accia utente gra ica, lAinterazione tra utente e sistema a!!iene grazie ad un sistema di gestione degli e!enti. ?ualsiasi interazione tra la macc"ina e lAesterno genera un e!ento c"e !iene intercettato e gestito dal sistema operati!o. LAinter accia utente gra ica, principalmente, !iene !ista come una collezione di oggetti annidati, nel senso c"e saranno presenti oggetti c"e conterranno degli altri. (ccorre subito distinguere due tipi di oggetti di una 73' H7rap"ics 3nit 'nter aceI% oggetti contenitori ed oggetti componenti. 7li oggetti contenitori sono quelli allAinterno dei quali possibile posizionare e dimensionare altri oggetti H@inestre e PannelliI. La @inestra costituita da unAarea c"e pu4 contenere !ari elementi. Pu4 essere presente una barra del titolo, allAinterno della quale ci sono i pulsanti c"e gestiscono la sua c"iusura ed il suo ridimensionamento. 'l Pannello costituito da un rettangolo, il cui perimetro pu4 essere reso !isibile o meno, cosE come il suo contenuto. 7li oggetti componenti sono quelli c"e !engono inseriti allAinterno degli oggetti contenitori HLabel, Jutton, )"eckJo*, ecc9I. 3na Label Hetic"ettaI una stringa di testo utilizzata per etic"ettare altri componenti o !isualizzare una descrizione !isibile nella 73'. ' Jutton HpulsantiI sono semplici componenti c"e a!!iano unAazione quando !engono premuti. 3na Te*t@ield Hcampo di testoI costituita da una o pi6 rig"e e consente di immettere testo al suo interno.

Introduzione alla programmazione ad eventi


?uando si !eri ica un qualsiasi e!ento, il sistema lo intercetta ed in!ia le in ormazioni Htipo di e!ento ed oggetto origineI ad uno speciale manipolatore degli e!enti. 7li e!enti controllabili dal nostro sistema generalmente tre%

#!enti del mouse #!enti della tastiera #!enti del sistema

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

La seconda de inisce e!enti quali%


-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

'n ine, la terza de inisce e!enti quali%

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

La seconda de inisce e!enti quali%

)ambio, c"e !iene generato quando !iene modi icato il !alore di un oggetto

La terza de inisce oggetti quali%


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

La quarta de inisce e!enti quali%


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

#clipse, Android S+L e con igurazione A5+ =ello world

Eclipse, Android SDK e configura ione A!D


'l principale IDE H'ntegrated +e!elopment #n!ironmentI per lo s!iluppo su piatta orma Android Eclipse. #sso un ambiente di s!iluppo c"e integra al suo interno !ari strumenti per acilitare e centralizzare la costruzione di una applicazione. -olto amoso per essere cross-platform Hpu4 essere installato su Mindows, Linu* e -acI e per la sua capacit2 di integrare !ari plugin per renderlo compatibile con di!ersi linguaggi di programmazione. Per installarlo basta andare nella sezione download del sito % "ttp%NNwww.eclipse.orgNdownloadsN 'n automatico !err2 riconosciuta la !ersione del sistema operati!o e noi possiamo scegliere se scaricare la !ersione a O/bit o ;8bit.

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

)liccando su (L ci !err2 restituita la lista dei tools da poter scaricare.

&el passo successi!o ci !erranno mostrati i componenti c"e !erranno scaricati.

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.

Poi si pro!!ede alla con igurazione dell'icona dell'applicazione.

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.

'l risultato sar2 il seguente

&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.

'l risultato sar2 il seguente% il nostro emulatore ci mostrer2 la nostra applicazione

' 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

&ex%!ie', Au%o(omple%e&ex%!ie', )ul%iAu%o(omple%e&ex%!ie' e (*ec$ed&ex%!ie'


L'oggetto 0e.t)iew il classico componente etic"etta di testo c"e ser!e per !isualizzare semplicemente del testo. 'l controllo #uto1omplete0e.t)iew una casella di testo con delle possibili parole di de ault c"e possono essere inserite. ?uando iniziamo a scri!ere il controllo mostrer2 le possibili parole c"e possono essere scelte da una lista. Attenzione, con possibili parole non signi ica c"e possiamo inserire solo quelle, ma tutte. La particolarit2 di questo componente c"e l'intellinsense, o!!ero la lista di possibili parole c"e ci !iene proposta, unziona una sola !olta, cio !err2 !isualizzata solo per una parola. La &ulti#uto1omplete0e.t)iew praticamente una Auto)ompleteTe*t5iew con l'aggiunta c"e l'intellinsense opera su pi6 parole, opportunamente separate da un carattere speciale. ?uindi la lista delle parole !err2 !isualizzata pi6 !olte e non solo una !olta come nell'Auto)ompleteTe*t5iew. L'esempio di codice mostra con semplicit2 come utilizzare questi tre controlli
+,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 .5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/hello" /4 .Auto"omplete5e0t*iew android1id2"@(id/t)tauto" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .MultiAuto"omplete5e0t*iew android1id2"@(id/t)tmulti" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 ."hecked5e0t*iew android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1te0t2"@string/check" android1gravity2"center_hori*ontal" android1te0t"olor2"+0000,," android1checked2" alse" android1checkMark2"@drawa-le/ic_launcher" /4 .//inear/ayout4

#' 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

Bu%%on, /mageBu%%on e &oggleBu%%on


'l 2utton HpulsanteI uno dei pi6 classici componenti, utilizzato spesso per dare !ia a delle operazioni. L'Image2utton non altro c"e un Jutton, sia in comportamento sia in struttura, ma con una immagine di s ondo. 'l 0oggle2utton il classico pulsante di (nN( .
+,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 .Button android1id2"@(id/-tn1" android1te0t2"@string/pulsante" android1layout3width2"wrap_content" android1layout3height2"wrap_content" /4 .'mageButton android1id2"@(id/-tnimg1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1contentBescription2"@string/contentimg" android1te0t2"@string/immagine" android1src2"@drawa-le/ic_launcher" android1on"lick2"0est1lick" /4 .5oggleButton android1id2"@(id/-tntoogle1" android1layout3width2"wrap_content" android1layout3height2"wrap_content" android1te0t%n2"Acceso" android1te0t%ff2".pento" /4 .//inear/ayout4

&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.

3rogressBar, 0a%ingBar e See$Bar


La Progress2ar, o!!ero barra di progresso, un componente utilizzato per !isualizzare lo stato di un'operazione. La 4ating2ar la consueta barra di gradimento, utilizzata molto per !otazioni di !ideo o immagini e rappresentata dalle classic"e stelle. La "eek2ar una barra c"e consente di selezionare un !alore in un certo range di !alori discreti.
+,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 .ErogressBar android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1ma02"100" android1progress2";<" style2"@android:style/=idget.7rogress>ar.&ori*ontal" /4 .+atingBar android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1ma02"100" android1rating2";<" /4 .(eekBar android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1ma02"100" android1progress2";<" /4 .//inear/ayout4

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

+i seguito la classe di esempio%


public class =0pandable/ist*iewEroHectActivity ex%ends Activity =0pandable/istAdapter mAdapter; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); mAdapter 2 ne' My=0pandable/istAdapter&); &&=0pandable/ist*iew) find*iewBy'd&+.id.e)plist1)).setAdapter&mAdapter); , public class My=0pandable/istAdapter ex%ends Base=0pandable/istAdapter priva%e (tring:; groups 2 <Gomi di persona<- <Gomi di cane<<Gomi di gatti<- <Gomi di pesci< ,; priva%e (tring:;:; children 2 <Alberto<- <+oberto<- <Eaolo< ,<Kuri<- <+ocky< ,<Briciola<- <Euccia< ,<Eallina< , ,; public %bHect get"hild&in% groupEosition- in% childEosition) re%urn children:groupEosition;:childEosition;; , public long get"hild'd&in% groupEosition- in% childEosition) re%urn childEosition; , public in% get"hildren"ount&in% groupEosition) re%urn children:groupEosition;.length; , public 5e0t*iew getCeneric*iew&) Abs/ist*iew./ayoutEarams lp 2 ne' Abs/ist*iew./ayoutEarams& *iewCroup./ayoutEarams.MA01&_7A:340- LD); 5e0t*iew te0t*iew 2 ne' 5e0t*iew& =0pandable/ist*iewEroHectActivity.%*is); te0t*iew.set/ayoutEarams&lp); te0t*iew.setEadding&AL- ?- ?- ?); re%urn te0t*iew; , public *iew get"hild*iew&in% groupEosition- in% childEositionboolean is/ast"hild- *iew convert*iew- *iewCroup parent) 5e0t*iew te0t*iew 2 getCeneric*iew&); te0t*iew.set5e0t&get"hild&groupEosition- childEosition).to(tring&)); re%urn te0t*iew; , public %bHect getCroup&in% groupEosition) re%urn groups:groupEosition;; , public in% getCroup"ount&) re%urn groups.length; ,

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

Toast &oti ication -essageJo* HAlert+ialogI

&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 la,out successi!o rappresenta come si de!e presentare la noti ica.


.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)tnot" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4

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

LinearLa,out TableLa,out Relati!eLa,out @rameLa,out La,out misto

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 Touc" -ultitouc"

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

@ile -ail -enu Tab ActionJar -ediaPla,er

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

'mpostiamo, in!ece, due la,out per le nostre pagine, ecco il primo...


.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-1" android1layout3width2" ill_parent" android1layout3height2"wrap_content" android1gravity2"center" android1te0t2"@string/tta-1" /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

'n!io S-S Lista cartelle S-S 'n!io c"iamata 'ntercettare c"iamata

/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

'l la,out ser!ir2 per inserire destinatario, un messaggio e il pulsante di in!io.


public class (end(M(EroHectActivity ex%ends Activity implemen%s %n"lick/istener =dit5e0t t0tnumber; =dit5e0t t0ttesto; $%verride public void on"reate&Bundle saved'nstance(tate) super.on"reate&saved'nstance(tate); set"ontent*iew&+.layout.main); t0tnumber 2 &=dit5e0t) find*iewBy'd&+.id.t)tnum-er); t0ttesto 2 &=dit5e0t) find*iewBy'd&+.id.t)tte)t); Button btninvia 2 &Button) find*iewBy'd&+.id.-tninvia); btninvia.set%n"lick/istener&%*is); , $%verride public void on"lick&*iew v) (msManager smanager 2 (msManager.getDe ault&); smanager.send5e0tMessage&t0tnumber.get5e0t&).to(tring&)- nullt0ttesto.get5e0t&).to(tring&)- null- null); , ,

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

1is%a car%elle S)S


'n questo esempio, !edremo come elencare i nostri sms contenuti in memoria. +i seguito il la,out dell'acti!it,, c"e conterr2 una lista di cartelle sms selezionabili e la lista degli sms letti.
.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 .(pinner android1id2"@(id/ older" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 ./ist*iew android1id2"@(id/listsms" android1layout3width2" ill_parent" android1layout3height2"wrap_content" /4 .//inear/ayout4

'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); ,

'nserire, naturalmente, il permesso per poter e ettuare la c"iamata.


.usesIpermission android1name2"android.permission.1A22_7&643"/4

#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;

$%verride pro%ec%ed void onErogressNpdate&'nteger... progress) (tampaMessaggio&progress:?;.to(tring&) O <U<); , $%verride

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 /

Passaggio di parametri 7rid5iew'con Midget

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 .

Potrebbero piacerti anche