vuoi
o PayPal
tutte le volte che vuoi
layout.setGravity(Gravity.CENTER);
layout.addView(button);
setContentView(layout);
}
….
}
Per la gestione degli eventi, inoltre, è possibile ridurre le righe di codice necessarie in
alcuni modi:
• Qualunque classe può diventare un listener senza necessariamente scriverne di
nuove
• Usando lo stesso listener di evento per più widget
• Usare classi anonime
Ad esempio, la stessa classe MainActivity potrebbe implementare OnClickListener,
ridefinendo all’interno della classe il metodo public void onClick(View v).
Presupponendo di utilizzare due bottoni differenti, il suddetto metodo potrebbe
eseguire del codice differente a seconda del bottone schiacciato.
Oppure, è possibile utilizzare classi anonime, come nel seguente esempio:
I principali eventi gestibili sui widget sono:
1. Click: metodo setOnClickListener() con metodo da ridefinire onClick(View view)
il cui parametro è il widget che ha subito l’evento.
2. Click lungo: metodo setOnLongClickListener() con metodo da ridefinire
onLongClick(View view). Tale metodo deve inoltre restituire un booleano per
segnalare se l’evento è stato completamente gestito (true) oppure no (false).
3. Tocco: metodo setOnTouchListener() con metodo da ridefinire
onTouch(View view, MotionEvent event) dove MotionEvent riporta i dettagli
dell’evento (tipo di azione, coordinate durata, e così via). Anche questo metodo
restituisce un booleano.
4. Focus: metodo setOnFocusChangeListener() con metodo da ridefinire
onFocusChange(View view, boolean hasFocus). Il parametro booleano serve a
stabilire se il focus è sul widget oppure no. In particolare, quando un widget
riceve il focus vuol dire che è selezionato e per questo tutti gli eventi di
digitazione saranno rivolti a lui.
5. Digitazione: metodo setOnKeyListener() con metodo da ridefinire
onKey(View view, int keyCode, KeyEvent event). Il parametron keyCode riporta il
codice associato al tasto premuto mentre quello di tipo KeyEvent riporta
ulteriori dettagli (tasto pigiato, tasto rilasciato e così via). Il metodo restituisce
un booleano. Il suddetto evento è utilizzato per segnalare la pressione o il
rilascio di un tasto della tastiera hardware.
Intent
Un’Intent è una descrizione astratta di un’operazione, ovvero descrive ciò che
l’applicazione vorrebbe fare (anche riutilizzando componenti esistenti di altre
applicazioni).
Le comunicazioni basate su Intent sono tecniche di late run-time binding tra
componenti di una stessa applicazioni o di applicazioni diverse. La risoluzione delle
richieste avviene a run time tramite meccanismi messi a disposizione dal sistema
operativo Android.
Le strutture dati fondamentali di un Intent filter sono:
• Action, l’azione da eseguire
• Category, la tipologia di azione da eseguire
• Type, il tipo di dati su cui agire.
Ad esempio, l’intent che permette di aprire una pagina web tramite browser ha come
action VIEW e come dati la URL della pagina web:
Intent intent = new Intent(android.content.Intent.VIEW_ACTION,
Uri.parse(http://www.google.it));
Le intent possono essere esplicite o implicite:
Come è intuibile dall’immagine, le intent esplicite si utilizzano nel caso in cui l’Activity
chiamante conosce esattamente quale activity andare a richiamare. Per fare ciò è
necessario eseguire sostanzialmente due passi: creare l’intent e lanciarla con il
metodo startActivity().
In una intent implicita, invece, non siamo a conoscenza del componente che
eventualmente si occuperà di gestire la nostra richiesta, la quale sarà definita
attraverso un’apposita action. La action di un Intent viene impostata attraverso il
metodo public Intent setAction(String action).
La stringa utilizzata come parametro di input segue la convenzione
<package applicazione>.intent.action.NOME_ACTION
La Action richiesta dovrà essere presente tra quelle definite in appositi filtri detti
IntentFilter definiti in AndroidManifest.xml (un esempio è visualizzabile dal progetto di
default creato da Eclipse).
Un esempio di utilizzo di Intent implicita è il seguente:
La sola Action, però, potrebbe non essere sufficiente. La ACTION_VIEW, per esempio,
permette la visualizzazione di un’informazione generica e le Activity che si occupano
di visualizzare tipologie di dato differenti (come un’immagine o un contatto) sono
diverse anch’esse. È quindi necessario un meccanismo che permetta di associare
un’Intent a un tipo specifico di dato.
Menù
In Android esistono tre differenti tipi di menù che possono essere collegati ad una
Activity:
1. Options Menu: Menù concepiti per raggruppare le opzioni ed i comandi di
un’applicazione. È composto da due sotto-gruppi, icon menu ed expanded
menu.
Quello mostrato è l’icon menù dell’applicazione DoveConviene, che mostra le
operazioni principali di cui è capace. Cliccando, per esempio, su Impostazioni, si
apre quello che dovrebbe essere un’expanded menu:
Ogni Activity può contenere un solo options menu, realizzabile con il metodo:
public boolean onCreateOptionsMenu(Menu menu)
Ridefinendo questo metodo è possibile intercettare queste chiamate e popolare
così il menu fornito con le voci utili alla propria applicazione. Tale metodo deve
restituire alla fine un booleano: true per rendere attivo il menù realizzato e false
per dichiarare che l’attività non dispone di un menù (per i dispositivi dotati di
tasto, la pressione del tasto menù non deve produrre nulla).
Per popolare il proprio options menu nel metodo sopra descritto, si possono
usare i metodi:
• public MenuItem add(CharSequence title)
• public MenuItem add(int titleRes)
Questi metodi aggiungono un element al menu, il cui titolo può essere espresso
con una sequenza di caratteri o con il riferimento ad una risorsa di tipo stringa
memorizzata su XML.
2. Context Menu: Menù contestuali che appaiono quando si mantiene il tocco per
qualche istante su un widget che ne è dotato (simile al click destro di un mouse
in ambiente Desktop).
Quello nella figura sovrastante, invece, è un esempio di Context Menù (in
particolare quello dell’applicazione di Adobe Reader).
3. Submenu: Applicazioni dotate di molti comandi possono usufruire dei
submenu. Nei menù precedenti è infatti possibile inserire un elemento che non
esegue un’operazione diretta, bensì apre un ulteriore menù, nel quale si
presentano altre scelte.
I menù possono essere definiti in XML anziché in Java e sono contenuti nella cartella
res/menu. In questo modo è necessario l’utilizzo di tag quali <menu>, <group> e
<item> per definire i menu in modo dichiarativo.
Android I/O
Premessa: in Java l’approccio alla gestione delle funzioni di I/O è basato sull’astrazione
sia delle sorgenti/destinazioni sia delle modalità di lettura/scrittura.
Esistono:
• Diversi tipi di sorgenti/destinazioni: memoria centrale, file, console di
comando, connessioni di rete, eccetera
• Diverse modalità di lettura/scrittura: sequenziale, accesso casuale,
bufferizzata, binaria, a caratteri, per linee, per parole, eccetera
Per ricevere in ingresso dei dati, un programma apre uno stream su una sorgente di
informazioni (descritte sopra) e ne legge sequenzialmente le informazioni (secondo
una modalità first-in-first-out). Analogamente, un programma può inviare informazioni
ad un destinatario aprendo uno stream verso di esso e scrivendo sequenzialmente le
informazioni in uscita.
In modo semplificativo, il processo di lettura/scrittura può essere semplificato dallo
schema:
1. Apri lo stream
2. Finché ci sono altre informazioni
a. Leggi/scrivi l’informazione
3. Chiudi lo stream.
Il package java.io è composto da classi per la gestione di flussi di byte e classi per la
gestione di flussi di caratteri:
• Flusso di byte (byte stream): Si tratta di I/O binario in quanto sono trasferite
sequenze di bit. Viene utilizzato in generale per i dati (ad esempio i bit di
un’immagine). I flussi di byte sono divisi in flussi d’ingresso (InputStream) e
flussi d’uscita (OutputStream). Le varie classi che utilizzano gli stream di byte si
distinguono per il tipo di sorgente o di destinazione con cui possono dialogare.
Sorgenti diverse richiedono implementazioni diverse, sebbene i metodi per la
lettura e la scrittura siano gli stessi.
• Flusso di caratteri (character stream): Sono flussi di caratteri Unicode a 16
bit e parliamo quindi di I/O testuale (ad esempio i caratteri ASCII). Sono divisi in
lettori (Reader) e scrittori (Writer).
I possibili canali di input sono:
• Array di byte (ByteArrayInputStream)
• String (StringBufferInputStream)
• File (FileInputStream)
• Pipe – realizza lo scambio tra thread – (PipedInputStream)
• Concatenazione di stream (SequenceInputStream)
• Others.
Per l’output il discorso è analogo.
Fine premessa
Le applicazioni Android dispongono di una porzione di spazio sul file system del
dispositivo, all’interno del quale possono creare e leggere dei file. Tale spazio è gestito
in maniera ESCLUSIVA dall’applicazione, in quanto altre app non possono accedervi.
La classe android.content.Context, da cui derivano le Activity, dispone di una serie di
metodi utili per interagire con la porzione di file system assegnata all’applicazione.
Per la scrittura di un file in Android, si fa riferimento al metodo:
public abstract FileOutputStream openFileOutput(String name, int mode) throws
FileNotFoundException
dove il parametron name è il nome del file, mentre mode indica la modalità di
apertura del file, che può essere (ricordando che si possono combinare mediante OR
logico | ):
• Context.MODE_PRIVATE, che rende il file privato (solo l’applicazione può vederlo
e utilizzarlo).
• Context.MODE_APPEND, specifica che se il file è già esistente non deve
sovrascriverlo, ma deve aggiungere i nuovi byte.
• Context.MODE_WORLD_READABLE, rende accessibile IN SOLA LETTURA il file a
tutte le altre applicazioni.
• Context.MODE_WORLD_WRITABLE, rende accessibile in scrittura il file a tutte le
altre applicazioni.
Per leggere un file, invece, si fa riferimento al metodo:
public abstract FileInputStream openFileInput(String name) throws
FileNotFoundException
dove il parametron name è il nome del file da recuperare (eccezione di file non trovato
propagata), l’oggetto restituito è un input stream standard (di tipo
- Risolvere un problema di matematica
- Riassumere un testo
- Tradurre una frase
- E molto altro ancora...
Per termini, condizioni e privacy, visita la relativa pagina.