Comments
Description
Transcript
android:layout_height="wrap_content"
Android Activity, View e Layout Corso di programmazione di sistemi mobile 1 Activity In qualsiasi programma è sicuramente richiesta un interfaccia grafica che permetta all’utente di visualizzare e interagire con essa secondo i principi previsti dallo sviluppatore. In Android questa interfaccia viene solitamente gestita tramite le activity. Possiamo immaginare un activity come una schermata, un contenitore di componenti grafici e oggetti messi a disposizione all’utente. È facile intuire come in un applicazione possano esservi diverse schermate che comunichino, si richiamino e si susseguano anche più volte. E’ questo il motivo per cui solitamente un programma consiste in più activity connesse tra loro, la principale delle quali è solitamente definita main activity. Android organizza le activity secondo un principio di stack, in base al quale l’activity attualmente in uso è quella in cima. Il richiamo di una specifica activity porterà questa in cima allo stack, ponendo quindi le altre in uno stato di pausa. Ogni applicazione aperta mantiene uno stack delle Activity che permette di tornare all’activity precedente tramite la pressione del tasto back o all’invocazione di un metodo predefinito. In termini di programmazione, una activity è intesa come un estensione della classe android.app.Activity del framework di Android. Corso di programmazione di sistemi mobile 2 Ciclo Di Vita Ogni activity definita nel nostro progetto deve estendere la classe di Activity o una sua sottoclasse. Per poter comprendere al meglio le activity e come utilizzarle è necessario innanzitutto capire il suo ciclo di vita. I principali metodi sono: o 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. o 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. Corso di programmazione di sistemi mobile 3 o 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.) 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(). Per ognuno dei metodi appena citati esiste un metodo complementare: o 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). o onStop(): complementare a onStart() è eseguito nel momento in cui l’activity non è più visibile sullo schermo. o onDestroy(): invocato nel momento in cui l’activity viene eliminata, ad esempio a seguito della pressione del tasto Back. Corso di programmazione di sistemi mobile 4 Layouts Ogni activity ha bisogno di un proprio layout per definire come saranno 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. Android quindi disegna i componenti di una schermata attraverso oggetti della classe View, raccolti all'interno di oggetti ViewGroup (che possono raccogliere, a loro volta, altri oggetti View e ViewGroup), per creare strutture anche molto complesse, partendo da alcuni semplici componenti. La presentazione di informazioni all'interno di un'activity, per alcune applicazioni, è spesso legata a una sorgente di dati. In tal caso è particolarmente importante collegare quest'ultima ai meccanismi che hanno il compito di presentare le informazioni all'interno degli oggetti ViewGroup dell'activity. Corso di programmazione di sistemi mobile 5 La descrizione dell’interfaccia grafica di una applicazione può avvenire: • Attraverso file xml • Attraverso codice java Nel primo caso l'interfaccia grafica viene descritta in un file xml (res/layout) il cui nome è l'id che ne permette il riferimento. Il metodo findViewById(int ResourceId) della classe Activity ritorna un riferimento a un oggetto View presente all'interno delle risorse di progetto, attraverso il suo id. Nel secondo caso l’interfaccia grafica deve essere creata a runt-time andando a definire inoltre tutte le proprietà che si definiscono all’intero del file xml come il colore di sfondo, l’orientamento ecc. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);//file xml LinearLayout layout = new LinearLayout(this); setContentView(layout);//codice java } Corso di programmazione di sistemi mobile 6 View e ViewGroup Esistono diverse specializzazioni degli oggetti View e ViewGroup. Alcune specializzazioni della classe View, definiti all’interno del package widget, sono: • Button per rappresentare i bottoni • TextView, EditText per visualizzare e inserire il testo • ImageView per visualizzare le immagini Alcune specializzazioni della classe ViewGroup sono: • LinearLayout per disporre le view in modo verticale o orizzontale • RelativeLayout per disporre le view in base alla posizione relativa di un’altra view o del contenitore • TableLayout per disporre le view come se stessimo lavorando con una tabella Le specializzazioni dette sopra ereditano dalle rispettive classi padre numerosi metodi e costanti pertanto, durante la scrittura del codice, è necessario avere sempre a portata di mano la documentazione. Normalmente il layout più utilizzato è il LinearLayout Corso di programmazione di sistemi mobile 7 Linear Layout Si tratta di un layout che dispone le view lungo la direzione stabilita dalla proprietà android:layout_orientation, che può assumere i valori horizontal (le view sono disposte su colonne) e vertical (le view sono disposte su righe). Qualora il numero di view sia tale da andare oltre le dimensioni dello schermo si possono utilizzare le View: ScrollView e HorizontalScrollView. Esempio di LinearLayout orizzontale: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Invia" android:id="@+id/button" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancella" android:id="@+id/button2" /> </LinearLayout> Corso di programmazione di sistemi mobile 8 Esempio di LinearLayout orizzontale: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Invia" android:id="@+id/button"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancella" android:id="@+id/button2"/> </LinearLayout> Corso di programmazione di sistemi mobile 9 Relative Layout 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, nell’immagine a fianco, il bottone con id button1 viene posizionato in alto a sinistra all’interno del proprio contenitore. Il button2 viene posizionato al di sotto e a destra del button1 e 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. Corso di programmazione di sistemi mobile 10 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button1" android:id="@+id/button1" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button2" android:id="@+id/button2" android:layout_below="@+id/button1" android:layout_toRightOf="@+id/button1" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button3" android:id="@+id/button3" android:layout_below="@+id/button2" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout> Corso di programmazione di sistemi mobile 11 Widget I widget rappresentano le view che prevedono un interazione con l’utente. Android mette a disposizione diverse view base, le principali sono: • TextView per visualizzare del testo • EditText per inserire del testo • Button per visualizzare un pulsante • ImageView per visualizzare le immagini Corso di programmazione di sistemi mobile 12 TextView È una etichetta, label e graficamente rappresenta un semplice testo fisso. Viene definita all’interno di un file xml tramite il tag TextView <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Hello World" android:id="@+id/textView"/> La proprietà xml che ci consente di impostare il testo è android:text dove è possibile scrivere direttamente il testo o inserire un riferimento ad un stringa (@string/hello_world) Corso di programmazione di sistemi mobile 13 EditText Permette l’input di testo da parte dell’utente. Con l’attributo android:inputType si possono impostare i formati di input come password, testo, date, indirizzi ecc… La proprietà android:hint permette di inserire un testo di aiuto e viene visualizzato quando non è presente la parola inserita dall’utente <EditText android:id="@+id/email_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="inserisci password" android:inputType="textPassword" /> Corso di programmazione di sistemi mobile 14 Button È il classico pulsante la cui «pressione» comporta solitamente il verificarsi di un conseguente evento. L’azione da intraprendere alla pressione del pulsante può essere definita a livello di codice tramite il metodo OnClickListener dell’oggetto Button, oppure tramite la proprietà android:onClick. Se si utilizza la proprietà onClick dovrà essere definito un metodo con lo stesso nome all’interno dell’activity e dovrà avere come parametro la view. <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Visualizza« android:onClick="visualizzaPass" android:id="@+id/button_vis"/> //Metodo invocato con la pressione del Pulsante public void visualizzaPass(View view) { // … } //Alternativa usando OnClickListener Button button (Button)findViewById(R.id.button_vis); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { text.setText(password.getText()); } }); Corso di programmazione di sistemi mobile 15 Risultato ottenuto avviando l’applicazione e cliccando il pulsante visualizza dopo aver inserito una parola nel campo password del widget editText Corso di programmazione di sistemi mobile 16 ImageView View che permette di visualizzare una immagine, piu precisamente una Bitmap che può essere caricata dalle risorse (R.drawable) oppure dinamicamente da file. XML <ImageView android:src="@drawable/connected" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageViewId" /> Java: ImageView image = (ImageView) findViewById(R.id.imageViewId); image.setImageResource(R.drawable.connected); Corso di programmazione di sistemi mobile 17