Anteprima
Vedrai una selezione di 4 pagine su 11
Event, Intent, Menu e I/O Android Pag. 1 Event, Intent, Menu e I/O Android Pag. 2
Anteprima di 4 pagg. su 11.
Scarica il documento per vederlo tutto.
Event, Intent, Menu e I/O Android Pag. 6
Anteprima di 4 pagg. su 11.
Scarica il documento per vederlo tutto.
Event, Intent, Menu e I/O Android Pag. 11
1 su 11
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
Publisher
A.A. 2014-2015
11 pagine
1 download
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Wenress di informazioni apprese con la frequenza delle lezioni di Terminali Mobili e Multimedialità e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Napoli - Parthenope o del prof Di Capua Michele.