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
conerenza 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 ................................................................................................................................. /;
&otiication ................................................................................................................................... 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 sempliicano alcune procedure ritenute ondamentali o
soltanto per il semplice scopo di sempliicare 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 deinizione, 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 interacce utente possono essere
classiicate in% interacce testuali ed interacce graic"e.
Le interacce testuali, dette anc"e interacce 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
interaccia testuale, rendendo lAuso stesso del computer poco accessibile al pubblico.
Le interacce graic"e sono le odierne interacce con cui interagiamo. Tutti quei oggetti c"e si
muo!ono sullo sc"ermo, "anno migliorato lAuso del computer, rendendolo accessibile a tutti e
diusissimo in tutto il mondo.
La dierenza principale ra interaccia 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 unAinteraccia utente graica, 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.
LAinteraccia utente graica, 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 'nteraceI% 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 !eriica un qualsiasi e!ento, il sistema lo intercetta ed in!ia le inormazioni 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 deinisce 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 deinisce 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
'nine, la terza deinisce 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 modiic"e dellAutente
#!enti legati al uoco
#!enti generati dai mo!imenti delle inestre
La prima sottoGcategoria deinisce e!enti quali%
)arica, c"e !iene generato quando al caricamento degli oggetti
Abbandona, unzione opposta a )arica
La seconda deinisce e!enti quali%
)ambio, c"e !iene generato quando !iene modiicato il !alore di un oggetto
La terza deinisce 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 deinisce e!enti quali%
Ridimensiona@inestra, c"e !iene generato quando lAutente riduce o ingrandisce una inestra
Scorri@inestra, c"e !iene generato quando si eettua 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
classiicati 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 diicile 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 conigurazione A5+
=ello world
Eclipse, Android SDK e configuraione A!D
'l principale IDE H'ntegrated +e!elopment #n!ironmentI per lo s!iluppo su piattaorma 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 eettuato 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 deault and do not ask againD, al successi!o a!!io non ci
c"ieder2 pi6 il workspace e render2 quello scelto precedentemente il predeinito.
Adesso eettuiamo il download del S+L di base per Android dal sito %
"ttp%NNde!eloper.android.comNsdkNinde*."tml
Anc"e qui !err2 riconosciuta la piattaorma 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 conigurazione.
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 speciico 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 sotware 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 conigurazione 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 conigurazione 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 conigurazione 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 modiicare, 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 peretta 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 conigurazione 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
conigurazione 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 eettuare una conigurazione manuale andando su Run Q Run )onigurations.
'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
rierimento 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 deault 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 signiica 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 modiicare 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 deault 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&%*is-
android.+.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 deinito 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
identiicato, in questo caso simpleRdropdownRitemR1line, cio semplice lista ad una colonna.
&el caso della -ultiAuto)ompleteTe*t5iew da notare il metodo set0okenizer, do!e !iene
speciicato 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 deinire 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 modiicato 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, beoreTe*t)"anged e aterTe*t)"anged, ser!ono rispetti!amente ad intercettare
prima e dopo la modiica 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 sondo.
'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 conigurato 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 !eriicare 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_1-
cols);
list>.setAdapter&adapter);
,
'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 deinisce 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_1-
cols);
grid.setAdapter&adapter);
,
)ome per la List5iew abbiamo utilizzato un ListAdapter per deinire 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
speciic"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 deinire 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 deinire il !alore di deault.
+a notare c"e nella ProgressJar stato utilizzato l'attributo st,le c"e permette di deinire 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 modiicare 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% childEosition-
boolean 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-aniest.*ml il permesso ad accedere alla connessione
ad internet, altrimenti l'applicazione andr2 in errore.
.usesIpermission android1name2"android.permission.?403:430"/4
Risultato
&otiication
Toast
&otiication
-essageJo* HAlert+ialogI
&oas%
'l controllo 0oast un piccolo contenitore c"e !isualizza un messaggio di testo.
Adoperato spesso per notiicare 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 paragrao !edremo come !isualizzare una notiica nella #ction2ar.
'l primo la,out mostra l'acti!it, principale, con un pulsante c"e, una !olta cliccato, generer2 la
notiica.
.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/-tnnotiica"
android1layout3width2"ill_parent"
android1layout3height2"wrap_content"
android1te0t2"@string/visuali**a" /4
.//inear/ayout4
&el codice, la parte importante quella relati!a al metodo displa,&otiica, ric"iamato quando !iene
generato un click dal pulsante.
'l PendingIntent ci consentir2 di comunicare con il ser!izio di notiica caricato su un oggetto
!otification&anager.
?uest'ultimo, sar2 utilizzato per in!iare la notiica creata con il !otification-2uilder, settando
opportuni attributi come il titolo, l'oggetto, l'icona, ecc.
Al click sulla notiica !err2 a!!iata l'Acti!it, indicata nella prima 'ntent del metodo
displa,&otiica.
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.-tnnotiica);
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- ?- 'nt3Gotifica-
Eending'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 notiica.
.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 notiica, rica!a l'id della stessa e tramite
&otiication-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.notiication);
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 modiicarloI.
.+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 deault 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"let" /4
.5e0t*iew android1te0t2"0esto 8"
android1gravity2"right" /4
./5able+ow4
.5able+ow android1background2"+,,0000"4
.5e0t*iew android1layout3column2"1"
android1te0t2"0esto 9"
android1gravity2"let" /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 predeinito 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 rierimento 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 rierimento preissato.
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"let" /4
.5e0t*iew android1te0t2"0esto 8"
android1gravity2"right" /4
./5able+ow4
.5able+ow android1background2"+,,0000"4
.5e0t*iew android1layout3column2"1"
android1te0t2"0esto 9"
android1gravity2"let" /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 inondo 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'inormazione digitale.
?uello c"e aremo noi in questo esempio, caricare la lista dei sensori e iltrarne solo uno e
leggerne le inormazioni.
.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 supericie.
Senza perderci troppo in dierenze 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 inormazioni 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 dierenza 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 inormazioni.
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, sruttando 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
interaccia graica 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 Jragment mJrag;
priva%e Activity mAct;
priva%e (tring m5ag;
priva%e "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.getDeault&);
smanager.send5e0tMessage&t0tnumber.get5e0t&).to(tring&)- null-
t0ttesto.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-aniest.*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
eettuare 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- nomi-
Adapter.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 eettuare una c"iamata utilizzeremo banalmente l'applicazione interna oerta 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
eettua 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 eettuare 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 teleono.
.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, signiica 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 teleono.
.usesIpermission android1name2"android.permission.:3AD_7&643_.0A03"/4
3na particolarit2 del plugin Android dell'ambiente #clipse quella di poter eettuare 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
notiica, 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 supericiale alcuni
dei costrutti c"e ci ore il nostro sistema Android.
3tilizzeremo tre modi per eettuare 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 identiicatoreI 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 modiic"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 modiicare !alori rieriti 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 notiica con
l'etic"etta di testo dell'elemento.
Risultato
#idge%
' 6idget sono dei contenitori graici c"e !engono posizionati ed utilizzati sulla "ome o su una delle
sue pagine.
Adoperati per mettere in rilie!o inormazioni 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 dierenza con un'applicazione normale la classe a cui si a rierimento% 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 deiniscono 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 .