La mia prima app android! Beh, in tutto questo studiare android come funziona e come si sviluppa, ho deciso di rendere disponibile la prima app che ho sviluppato, si tratta di una semplice applicazione che illumina e spenge lo schermo (io la trovo utilissima come torcia). Questa applicazione non la trovate sull android market (ancora mi ci devo iscrivere) quindi se siete interessati a scaricarla ecco qua il qr-code: E l url diretto invece: http://italialinux.altervista.org/files/lightdroid.apk Piu in la penso che rilascero anche i sorgenti, magari al termine delle lezioni androdi che sto portando avanti potrebbe essere la base di un applicazione di esempio finale, per far vedere un intero progetto Android come portarlo avanti. Per ora se vi va potete scaricarla (mi farete un grande piacere :D). Se ci sono problemi o malfunzionamenti lasciate un commento e vi risponderò! Android Lezione 5 Il Context Menu In questa lezione introduciamo un nuovo oggetto dell interfaccia di Android: il Context Menu. Si tratta di uno dei menu messi a disposizione dal sistema
android, e viene chiamato quando l utente tocca per qualche secondo una View, per la quale è stato registrato un oggetto appunto di tipo Context Menu. Questo menu può essere utilizzato in vari contesti, per esempio si potrebbero voler mostrare delle opzioni se un utente tiene premuto il dito su una casella di testo, magari mostrando un elenco di opzioni disponibili, oppure durante la visualizzazione di un immagine per mostrare delle opzioni relative ad essa, etc. Passiamo ora a vedere come implementarlo. Per riempire le voci del menu sono disponibili diverse modalità, in questa guida vedremo principalmente quella basata sul file xml. Se state seguendo i tutorial aprite il progetto ItalialinuxExample che abbiamo iniziato durante le lezioni precedenti, altrimenti potete scaricarlo da qua Prima di tutto (per comodità) creiamo una cartella menu all interno di res: Qui andremo a mettere tutti i file xml relativi alle voci di menu. Ogni file indicherà un menù. Quindi creiamo un nuovo menu, clickando col destro sul folder appena creato selezionando: New -> Android XML File. Si aprirà una schermata simile alla seguente: Diamo un nome al File e selezioniamo come tipo: Menu. Nell esempio il file avrà come nome example(.xml). Premiamo Finish. Si apre così la schermata per editare i file xml (in questo caso i menù). Il file può essere editato in due modi: 1. Editando direttamente il sorgente 2. Utilizzando l interfaccia messa a disposizione da eclipse.
Noi utilizzeremo direttamente il secondo metodo, mostrando poi il risultato finale dell XML. Andiamo quindi a ad aggiungere tre elementi al nostro file menu: 1. 2. 3. TestItemUno TestItemDue TestItemTre Per farlo premiamo il pulsante add, si aprirà la seguente finestra: In questo caso, dovendo inserire un elemento del menu selezioniamo Item e diamo Ok Si aggiungerà un elemento, e ora verranno mostrate tutte le proprietà disponibile, in questo caso a noi interessa modificare solo due proprietà: id, e Title. Come id mettiamo itemuno_id e come Title: TestItemUno. Ripetiamo la stessa operazione anche per gli altri due elementi e salviamo. Così avremo il nostro menu bello e pronto da essere inserito nel ContextMenu. Il risultato finale visto dall xml sará il seguente: <?xml version="1.0" encoding="utf-8"> ; A questo punto siamo pronti per caricare il nostro menu. Prendiamo la nostra Activity, FirstActivity e iniziamo con l aggiungere gli import necessari (lo so che Eclipse ci aiuta in tutto e ce li inserisce per noi, ma ritengo che sia meglio
comunque metterli a mano almeno le prime volte ) import android.view.contextmenu; import android.view.contextmenu.contextmenuinfo; import android.view.menuinflater; A questo punto associamo il ContextMenu alla nostra TextView, utilizzando il metodo: registerforcontextmenu(view view); Che serve appunto ad associare un Context menu con una View. Quindi nel nostro esempio la chiamata diventerá: registerforcontextmenu(localtext); Dove ricordo che localtext era la TextView creata nelle lezioni precedenti, e ovviamente questa chiamata andrá messa dopo l inizializzazione e dichiarazione della TextView. A questo punto dobbiamo creare il metodo oncreatecontextmenu: public void oncreatecontextmenu(contextmenu menu, View v,contextmenuinfo menuinfo){ super.oncreatecontextmenu(menu, v, menuinfo); MenuInflater mymenu = getmenuinflater(); mymenu.inflate(r.menu.example, menu); Spieghiamo linea per linea: La prima linea chiama il metodo oncreatecontextmenu della classe padre La seconda linea dichiara un oggetto MenuInflater necessario per istanziare un file xml del menu all interno di un oggetto Menu. Con la terza linea chiamiamo il metodo inflate dell oggetto appena creato, che carica il menu dichiarato in R.menu.example all interno del ContextMenu menu (Con R.menu.example ci riferiamo appunto al file example.xml)
Ora se lanciamo l applicazione e proviamo a tenere il dito sul testo della TextView (ricordo che questo articolo é basato sulle lezioni precedenti) gia vediamo che il menu compare correttamente. Ovviamente non abbiamo terminato, in quanto dobbiamo anche associare delle azioni ad ogni elemento del menu, in questo esempio faremo apparire un messagio che stampa il nome del menu selezionato. La gestione della selezione é gestita dal metodo: oncontextitemselected, che andrá quindi implementato nella nostra classe, nel nostro esempio sará: public boolean oncontextitemselected(menuitem item) { Toast.makeText(this, item.gettitle(), Toast.LENGTH_SHORT).show(); return true; Questo metodo viene chiamato ogni volta che si seleziona una voce del menu. E l oggetto Item contiene le informazioni relative alla voce di menu selezionata. come si puo facilmente intuire con: item.gettitle(); Serve per prendere il campo title della voce del menu. Mentre con: Toast.makeText(this, item.gettitle(), Toast.LENGTH_SHORT).show(); Questa linea di codice invece, stampa sullo schermo il titolo dell elemento selezionato. Per utilizzarla dovete aggiungere il seguente import: import android.widget.toast; Con questo penso sia tutto. Per scaricare i sorgenti di questa lezione andate qua.
Android Lezione 4 I bottoni Nella lezione abbiamo visto come far scrivere del testo alla nostra applicazione, ora introduciam un altro degli oggetti base delle interfacce grafiche per android: I bottoni. In questa lezione spieghermo come inserirli nel progetto, e come gestire gli eventi di pressione del bottone. Modificheremo l applicazione di esempio aggiungendo 2 pulsanti che modificheranno il testo visualizzato nella TextView creata nell articolo precedente. Come per le textview anche i bottoni si definiscono all interno dei file xml del layout (ovviamente ogni activity avrà il suo file di layout). Ricordo che i file xml che gestiscono il layou si trovono all interno della cartella res/layout. Nel nostro esempio il file che andremo a modificare è main.xml. Abbiamo due possibilità per inserire il bottone, tramite il gui designer, e direttamente all interno dell xml (in pratica è la stessa cosa, visto che il gui designer scrive all interno del file xml). La prima modalità la potete vedere nella screenshot poco sopra, aprite sezione Form Widget e trascinate un button all interno dell area dell applicazione. Mentre se vogliamo definirlo a livello di codice xml dobbiamo inserire una stringa simile alla seguente: <Button android:text="button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content">
</Button> Dove: android:text indica il nome che verrà visualizzato nel pulsante android:id indica l id del pulsante che verrà utilizzato per accedervi a livello di codice android:layout_width indica la larghezza dell oggetto android:layout_height indica l altezza dell oggetto Chiariamo il significato di wrap_content, che non sembra essere una definizione di dimensione, infatti serve ad indicare che l oggetto sarà grande abbastanza per il suo contenuto. Salviamo e andiamo a controllare la classe R.java (ricordo che si trova nella cartella gen/. Vediamone ora il contenuto: package italialinux.example; public final class R { public static final class attr { public static final class drawable { public static final int icon=0x7f020000; public static final class id { public static final int button1=0x7f050000; public static final class layout { public static final int main=0x7f030000; public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; Come possiamo vedere è stato automaticamente aggiunto una variabile button1 all interno della subclass id (Ricordate
che avevamo definito l id del bottone con @id/button1?). Bene una volta definito il pulsante non ci resta altro che gestirne la pressione. Per fare questo si deve: Creare una classe che implementa OnClickListener e fare l override del metodo onclick(). Associare questa classe al bottone Ora vedremo due possibili modalità per gestire il click su di un pulsante. Il primo consiste nel fare l override del metodo onclick direttamente all interno della funzione per settare il Listener, il secondo esempio invece mostra come farlo utilizzando una classe ad-hoc. Prima di tutto diamo un occhiata agli import necessari: import android.widget.button; import android.view.view.onclicklistener; Ora ovviamente ci serve l accesso al bottone, questo lo facciamo mediante la findviewbyid, definiamo quindi una variabile di tipo Button all interno della nostra Activity (nell esempio l ho definita una variabile interna del metodo oncreate): Button firstbutton = (Button) findviewbyid(r.id.button1); Ora prima di procedere con la spiegazione dei due metodi, vi invito a vedere i metodi disponibili per la classe Button, noterete la presenza dei metodi settext(charsequence ) e gettext(), che ci permettono di modificare/ottenere runtime il testo visualizzato all interno del bottone. Quindi cambiamo il testo al nostro pulsante con Greetings : firstbutton.settext("greetings"); L associazione del listener con il bottone avviene mediante il metodo setonclicklistener della classe button che prende come argomento un oggetto di tipo View.OnClickListener. Passiamo ora a vedere il primo dei due metodi che per gestire
il click su di un pulsante. Il codice base in questo caso è molto semplice: firstbutton.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { //Stampa un messaggio ); In pratica stiamo facendo l override del metodo onclick direttamente all interno della nostra activity. Quindi per esempio potremo approfittarne per modificare il testo della textview che avevamo dichiarato nella lezione precedente. Per farlo dobbiamo prima fare una piccola modifica, ovvero dobbiamo portare la dichiarazione della variabile localtext al di fuori del metodo oncreate, ovvero renderla una variabile di classe. Inseriamo quindi nel pezzo di codice precedente, all interno di onclick la seguente riga: localtext.settext("hello again from Italialinux"); Così facendo abbiamo completato la gestione della pressione del pulsante. Questo metodo è utile secondo me nel caso in cui dobbiamo far fare operazioni elementari al nostro bottone, che coinvolgono un numero ristreetto di oggetti. Personalmente ritengo anche che contribuisca a rendere il codice meno leggibile (ma questa è una mia opinione). Passiamo ora al secondo caso. Per fare questo aggiungiamo un secondo bottone chiamato button2, e carichiamolo all interno della nostra activity (questa volta non ve lo spiego, ve lo lascio come esercizio), e creiamo una classe per gestire l evento onclick chiamata ButtonAction. Create quindi un nuovo file java chiamato ButtonAction.java, lo scheletro della nostra classe sarà il seguente: package italialinux.example;
import android.view.view; import android.view.view.onclicklistener; public class ButtonAction implements OnClickListener { @Override public void onclick(view arg0) { // TODO Auto-generated method stub Notate che questo codice è autogenerato da Eclipse. Come possiamo vedere la nostra classe implementa l interfaccia OnClickListener, che è quella che appunto contiene il metodo onclick che andremo a popolare. Ora quello che vogliamo fare è modificare nuovamente la TextView con il messaggio: Hello from a ButtonAction!!. Per farlo questa volta non possiamo usare direttamente localtext, in quanto ci troviamo all interno di un classe differente. Quindi la soluzione migliore é passare alla classe gli oggetti che ci servono (dipende dalla nostre esigenze) quindi, dal momento che dobbiamo modificare i valori della variabile localtext, che é una TextView, creiamo un costruttore che prende un argomento di tipo TextView appunto, che verrá salvato all interno di una variabile di classe. Ora possiamo fare l override del metodo onclick. Il risultato finale sará simile al seguente: package italialinux.example; import android.view.view; import android.view.view.onclicklistener; import android.widget.textview; public class ButtonAction implements OnClickListener { TextView btnlocaltext;
public ButtonAction(TextView tv) { super(); btnlocaltext = tv; @Override public void onclick(view arg0) { btnlocaltext.settext("hello from a ButtonAction!!"); Mentre nell Activity, dovremo prendere il riferimento al pulsante, come fatto per il button1 e assegnarli il Listener appena creato. Il che diventa: Button secondbutton = (Button)findViewById(R.id.button2); secondbutton.setonclicklistener(new ButtonAction(localText)); Una piccola precisazione: Nell implementare la vostra classe, prima di eseguire qualsiasi operazione con bottoni, label, etc dovete chiamare la setcontentview con almeno un layout. Altrimenti l applicazione non riuscirá a partire. Infine uno screenshot di come appare la versione aggiornata dell applicazione: I sorgenti aggiornati della lezione li potete trovare qua La prossima laezione vedremo i primi esempi di menu.