Google Android: In questi giorni non si parla d’altro! Ne parlano siti e blog che si occupano di IT, di telefonia, di programmazione, di linux; ne parlano i telegiornali, i giornali, gli anziani al parco, le massaie al mercato… (ok, ok, ho decisamente esagerato ;-))
Essendo me stesso la persona più curiosa che conosco (almeno fin da quando ero piccolo) potevo forse non provarlo? Naturalmente la risposta è NO (anche perché sennò non sarei qui a scrivere); mi sono armato di SDK prelevato dalla pagina del progetto android, ho installato il plugin per Eclipse seguendo le apposite istruzioni, mi sono armato di caffè a volontà ed ho cominciato a fare conoscenza con questo misterioso androide…
Creazione di un progetto Android
Se c’è una cosa per cui i ragazzi di Google sono famosi, si sa, è quella di fare le cose fatte bene. Il rilascio di un plugin (già di buona fattura) per Eclipse in concomitanza al rilascio della prima versione del Software Development Kit, consente di ridurre al minimo il tempo perso nella preparazione dell’ambiente di sviluppo, concentrandosi fin da subito sullo studio del framework e la scrittura di codice. Infatti, dopo aver seguito la guida per l’installazione dell’SDK e del plugin Eclipse, è sufficiente creare un nuovo progetto, nella finestra di selezione della procedura guidata selezionare “Android Project” e compilare il semplice form:

Un progetto Android è diviso sostanzialmente in due parti: i sorgenti (contenuti nella cartella src) che contengono il codice Java dell’applicazione e le risorse (cartella res) che sono, ad esempio: il file xml che descrive il layout dei widget nello schermo, le icone ed immagini utilizzate, ed altro.
Il nuovo progetto per Android contene l’Activity principale che non è altro che un oggetto rappresentante una singola schermata di una applicazione e contenente uno o più View (i controlli o widgets derivano tutti da una classe View) e i files di risorse necessari per una applicazione di base.

Armatura dell’androide: Disegnare il Layout
Come detto in precedenza il layout dello schermo dell’applicazione è descritto da un documento XML contenuto nella cartella “layout” contenuta in “res”. Nel caso della nostra applicazione il file di layout si chiama “main.xml” e contiene il codice seguente:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:gravity=”center_horizontal”
>
<TextView id=”@+id/txtHello”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”"
/><AnalogClock
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/><Button id=”@+id/btnHello”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Hello me!”
/></LinearLayout>
Innanzitutto è creato un oggetto “LinearLayout” che definisce una disposizione lineare in orizzontale o in verticale per i widget contenuti (una sorta di corrispettivo di un JPanel swing a cui è applicato un box Layout con orientazione verticale):
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:gravity=”center_horizontal”
>
In questo caso è creato un layout orizzontale definito dall’attributo orientation=”vertical”, inoltre si specifica che il layout occuperà l’intero schermo definendo le proprieta della larghezza: layout_width=”fill_parent” ed altezza: layout_height=”fill_parent” perché occupino tutto lo spazio disponibile nel componente che li ospita (in questo caso lo schermo intero). L’ultimo attributo gravity=”center_horizzontal” definisce l’allineamento al centro per i controlli contenuti nel layout.
In seguito alcuni widget sono aggiunti al layout, in particolare:
<TextView id=”@+id/txtHello”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”"
/>
Aggiunge come primo elemento una label di testo larga come tutto il layout che la ospita e con una altezza che si adatta automaticamente al contenuto della label. Inoltre viene inizializzata con un testo vuoto. Il secondo componente è un orologio analogico (so benissimo che in una applicazione “Hello World” solitamente l’orologio non ci andrebbe…però mi piaceva troppo!):
<AnalogClock
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
anche in questo caso largo come tutto il layout che lo ospita e con una altezza che si adatta automaticamente al contenuto. Infine un bottone che, guarda caso, servirà per visualizzare una stringa di saluto sulla TextView precedentemente aggiunta:
<Button id=”@+id/btnHello”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Hello me !”
/>
Entrambe le dimensioni del bottone sono adattate al contenuto, cioè la scritta “Hello Me !” e, per l’attributo gravity definito nel layout, sarà allineato al centro dello schermo.
E’ interessante notare il fatto che sia per TextView che per Button è definito l’attributo id, questo serve per assegnare un nome identificativo al controllo (nel nostro caso la TextView è chiamata txtHello ed il bottone btnHello…fantasioso eh!?); tale attributo sarà utilizzato nel sorgente Java per riconoscere i componenti ed interagirvi.
Terminata la definizione del layout ci possiamo concentrare sulla scrittura del codice.
Intelligenza artificale: Il Codice Sorgente
Il codice sorgente è costituito principalmente da una classe AndroidExperimentActivity che estende una Activity (quindi una singola schermata). Una Activity implementa diversi metodi corrispondenti ad eventi cui è soggetta; fra i più interessanti ci sono sicuramente:
- onCreate: invocato al momento della creazione dell’activity e che viene utilizzato per la sua inizializzazione come vedremo in seguito.
- onPause: è invocato quando l’utente abbandona l’activity senza però uscirne. E’ utile allo scopo di salvare le informazioni si stato dell’activity per garantirne la persistenza.
- onDestroy: è invocato prima della distruzione dell’activity edè utile per la pulizia dei dati e della memoria.
Ci sono moltissimi altri metodi come onStart, onStop, onFreeze, etc…, per la cui spiegazione rimando al referenece di android per le activity.
Nel nostro caso reimplementiamo il metodo onCreate all’interno del quale inizializziamo i componenti. Il codice sorgente è:
package org.brainspace.android;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class AndroidExperimentActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);final TextView txtHello = (TextView) findViewById(R.id.txtHello);
final Button btnHello = (Button) findViewById(R.id.btnHello);btnHello.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
txtHello.setText(“hello World, I’m Android!”);
}
});}
}
Innanzitutto, dopo la definizione del package, sono importate le classi che andremo ad usare in seguito, poi, la dichiarazione della classe AndroidExperimentActivity e quindi l’overriding del metodo onCreate. Dopo aver invocato il metodo onCreate della classe genitore siamo passati ad applicare il layout creato precedentemente, tramite l’invocazione del metodo:
setContentView(R.layout.main);
La classe R è creata dal plugin Eclipse per indicizzare il contenuto della cartella delle risorse. Ogni volta che modifichiamo una o più risorse la classe R.java viene aggiornata automaticamente dal plugin Eclipse. Nel nostro caso il contenuto di R.java è:
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/package org.brainspace.android;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0×7f020000;
}
public static final class id {
public static final int btnHello=0×7f050001;
public static final int txtHello=0×7f050000;
}
public static final class layout {
public static final int main=0×7f030000;
}
public static final class string {
public static final int app_name=0×7f040000;
}
}
In questo caso restituisce l’id del layout definito nel file main.xml, layout che viene caricato come contenuto principale dell’activity.
In seguito vengono create due istanze di oggetti TextView e Button ed inizializzate con le informazioni contenute sempre nel file main.xml recuperate grazie all’id che gli abbiamo assegnato:
final TextView txtHello = (TextView) findViewById(R.id.txtHello);
final Button btnHello = (Button) findViewById(R.id.btnHello);
A questo punto è necessario assegnare un click listener al bottone in modo che alla pressione del bottone la label visualizzi il messaggio di saluto. Similmente a swing è necessario creare una istanza di oggetto OnClickListener() che implementi il metodo onClick() facendogli impostrare la proprietà text dell’oggetto txtHello:
btnHello.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
txtHello.setText(“hello World, I’m Android!”);
}
});
Energia: Eseguire il progetto
Ora non ci resta altro da fare se non testare la nostra Utilissima (proprio con la U maiuscola…
)applicazione, perciò apriamo la finestra di esecuzione (Esegui->Esegui…) e creiamo una nuova configurazione per Android (Click con il tasto destro su Android Application->Nuovo) e riempiamo i campi come in figura:
Fatto ciò clickiamo su Esegui e godiamoci il nostro fantastico software (se non altro il fatto che ci sia l’orologio non lo rende proprio completamente inutile…no?
).
Riferimenti
- Sono disponibili per il download i [Download not found]
I riferimenti per i materiali necessari per la realizzazione del progetto sono:
- L’SDK, il plugin per Eclipse e tutta al documentazione su Androi sono reperibili nella pagina principale del progetto
- L’ambiente di sviluppo Eclipse è disponibile sul sito del progetto



aprile 28th, 2010 at 20:54
Mi piace come spieghi in questa guida, molto chiaro e lineare!
Complimenti