Android Project, Activity, Layout e Toast
ANDROID PROJET Un progetto android è composto da diverse cartelle, ogni cartella può contenere uno o più file. Android_20150310 : cartella principale, contiene le varie applicazioni e librerie che si vogliono sviluppare (workspace) app : applicazione gradle : contiene i file necessari per compilare il progetto Applicazione (app) androidtest : cartella dove vengono riposti i vari file di testing main : cartella principale dell applicazione, si suddivide in altri sottocartelle java : file.java, codice scritto in JAVA che verrà interpretato dal compilatore res : risorse grafiche per creare l UI dell applicazione AndroidManifest.xml : contiene tutte le informazioni necessarie per l utilizzo dell applicazione 2
ANDROID MANIFEST L Android Manifest è il file più importante dell applicazione. In esso vengono specificate tutte le informazioni che l applicazione a bisogno per funzionare. Al suo interno vengono dichiarate: Le activity, i service e altri componenti che costituisco l applicazione I permessi che l applicazione utilizza, in modo che l app a runtime possa accedere alle varie API del dispositivo L hardware che necessita l applicazione per funzionare (Fotocamera, GPS, Bluetooth ) Il package di appartenenza (id universale dell app) La versione di SDK minima da utilizzare (*) La versione dell applicazione (*) * Con Android Studio alcune dichiarazioni sono state spostante nel file build.gradle 3
RES FOLDER La cartella res contiene tutte le risorse grafiche come immagini, file di layout, menu, definizione di temi e stile. drawable<density> : contiene file come immagini o.xml che permettono di definire forme o figure composte da utilizzare nei file di layout. Esistono diverse cartelle drawable che si differenziano in base alla densità degli schermi. layout : contiene i file.xml che definisco la UI (User Interface), un file layout può fare utilizzo dei file definiti nella cartella drawable, mipmap, values. menu : contiene file xml che costituiscono i menu delle varie activity o dei fragment. mipmap : come per i drawable contengono le immagini da utilizzare nell applicazione. values : contiene file come string.xml, style.xml dove vengono dichiarate le stringhe, i colori e altre constati per creare un UI dinamica, multilingua e personalizzata. I values come per i drawable si posso suddividere in base alla densità, all sdk ed a altre caratteristiche. 4
FILE R Il file R è un file generato automaticamente dal sistema quando si compila il progetto. Contiene un id numerico (Integer) per ogni file presente all interno della cartella res dell applicazione. Il file R è suddiviso in classi statiche create dinamicamente in base alle cartelle del file res: R.drawable. R.layout. R.menu. R.mipmap. R.values. Vi è, infine, un ulteriore classe statica: R.id. dove ID è un identificativo che viene assegnato automaticamente o manualmente ad un elemento all interno di un file di layout. Esiste un file R di sistema e un file R per ogni applicazione o libreria sviluppata per Android. Esempio, recuperare l id di una stringa: R.string.app_name; 5
ACTIVITY: COSA SONO? Le activities sono uno dei componenti fondamentali di un app Android; ogni applicazione è costituita da un insieme di activities correlate tra loro. Ogni activity svolge il proprio lavoro sul main thread non potendo interagire direttamente con altre activity. Un Activity può essere vista come una schermata contenente delle informazioni da visualizzare e con la quale l utente può interagire per svolgere determinate azioni (effettuare una chiamata, inviare un messaggio, modificare le impostazioni di sistema ecc). Nel manifest di ogni applicazione esiste un activity con un intent-filter impostato a main, tale intent definisce l activity principale che deve essere lanciata dal sistema all avvio dell applicazione. Ogni volta che viene lanciata una nuova activity, l activity uscente, cioè l acitivity che al momento si trova in primo piano viene inserita in un apposita pila, denominata back stack. Tale pila tiene traccia, per ogni applicazione, dell ordine con cui sono state invocate le activity. In tal modo, se l utente premerà il tasto back, sarà possibile ripercorrere a ritroso la sequenza di activities avviate. 6
ACTIVITY: CICLO DI VITA Ogni activity non è altro che una sottoclasse di Activity. Tale classe possiede dei metodi che è necessario ridefinire per poter gestire al meglio il ciclo di vita delle nostre activities. Per poter comprendere al meglio come utilizzarli è necessario innanzitutto capire il ciclo di vita di ogni activity. oncreate(): Invocato ogni volta che l activity viene creata. All interno di questo metodo è consigliabile effettuare tutte quelle operazioni che dovranno essere eseguite una sola volta, come ad esempio l impostazione del layout e l assegnamento dei riferimenti alle variabili. onstart(): viene invocato ogni volta che l activity viene portata in prima piano e quindi visualizzata sullo schermo. Al suo interno è buona norma impostare tutte le componenti relative alla visualizzazione delle informazioni. onresume(): tale metodo è richiamato ogni volta che l activity diventa interattiva, cioè quando l utente può interagire con essa. Pertanto al suo interno vanno gestite tutte quelle funzioni relative all uso da parte dell utente (suoni, animazioni, ecc.) 7
ACTIVITY: CICLO DI VITA Per ognuno dei metodi appena citati esiste un metodo complementare: onpause(): eseguito nel momento in cui l activity smette di essere interattiva. Essendo simmetrico a onresume() è necessario eliminare le eventuali risorse allocate al suo interno (ad esempio interrompere un eventuale canzone in riproduzione). onstop(): complementare a onstart() è eseguito nel momento in cui l activity non è più visibile sullo schermo. ondestroy(): invocato nel momento in cui l activity viene eliminata, ad esempio a seguito della pressione del tasto Back. Si aggiunge un ulteriore metodo, onrestart(), che viene eseguito nel caso in cui un activity precedentemente messa in pausa ritorna attiva. Esso è stato introdotto come alternativa a oncreate(), per tutte quelle situazioni in cui devono essere ripristinati oggetti inizializzati all interno di oncreate() e disabilitati nel metodo onstop(). 8
LAYOUTS Ogni activity ha bisogno di un proprio layout per definire come saranne visualizzate le informazioni da mostrare all utente ed i vari componenti per poter gestire l interazione con esso. Android ci mette a disposizione, oltre che una gran quantità di View, anche vari layouts per determinare la disposizione delle View. Tali layout, che ereditano tutti la superclasse comune ViewGroup, si differenziano per il modo in cui permettono di disporre la View in essi contenute. Essendo ViewGroup una sottoclasse di View, nulla vieta ai vari layout di contenersi vicendevolmente, per creare strutture anche molto complesse, partendo da alcuni semplici componenti. Sebbene ne esistano molti altri, i più comunemente utilizzati sono i seguenti: LinearLayout RelativeLayout FrameLayout 9
LAYOUTS: LINEARLAYOUT Il LinearLayout è uno dei layout più utilizzati. Si tratta di un componente molto semplice, che consente di mostrare le posizionare le View in riga o in colonna, a seconda del valore della proprietà orientation. Tale proprietà può essere impostata da XML, come mostra il frammento a lato, oppure da codice Java, ottenendo il riferimento all oggetto ed invocando su di esso il metodo setorientation(..) al quale va passata una delle seguenti costanti: LinearLayout.HORIZONTAL LinearLayout.VERTICAL Sempre osservando il frammento di codice XML, si nota come aggiungere View al layout, cioè inserendole all interno ai tag di apertura e chiusura del componente. Un alternativa è quella di utilizzare, da Java, il metodo addview(view v), ereditato dalla classe ViewGroup. 10
LAYOUTS: LINEARLAYOUT 11
LAYOUTS: RELATIVELAYOUT Il RelativeLayout richiede una gestione più complessa rispetto al LinearLayout, ma fra tutti i componenti messi a disposizione dalla piattaforma è probabilmente il più flessibile da utilizzare. Tale componente consente di definire il posizionamento di una delle View in termini relativi indicando, come deve posizionarsi rispetto ad una o più altre View presenti all interno del contenitore oppure rispetto ai margini laterali del relative layout. Ad esempio, nel frammento di codice XML a lato, il bottone con id button1 viene posizionato in alto a sinistra all interno del proprio contenitore. Dopodichè il button2 viene posizionato al di sotto e a destra del button1 ed il margine destro allineato con quello del proprio contenitore. Infine il button3 viene posizionato al di sotto del button2 allineando i margini sinistro e destro con quelli del RelativeLayout. il risultato è mostrato nella prossima slide 12
LAYOUTS: RELATIVELAYOUT 13
TOAST Un toast è un semplice messaggio utilizzato principalmente per fornire un feedback all utente su un azione compiuta da quest ultimo. Il toast viene mostrato per un determinato tempo e con un messaggio specifico. Toast.makeText(Context context, CharSequence text, int duration); Toast.makeText(Context context, int textresid, int duration); Si può anche personalizzare il toast utilizzando i metodi presenti all interno della classe Toast 14
ESERCIZIO Creare un applicazione che presenta un layout di tipo Relative. Aggiungere un campo di testo con allineamento in alto, a sinistra e a destra rispetto al padre (RelativeLayout) e un pulsante centrato verticalmente e orizzontalmente rispetto al padre (RelativeLayout). Alla pressione del pulsante (xml:onclick o java:setonclicklistener) si deve recuperare il testo inserito dall utente e visualizzarlo tramite un toast. Versione avanzata: Aggiungere un RadioGroup e due RadioButton per indicare il tempo di visualizzazione del toast (short o long) 15