Understanding Android: I Layout

Diego Stamigni
Diego Stamigni
Understanding Android: I Layout

Salve cari lettori,

dato il grande successo dovuto all'Understanding Android, ho deciso di continuare quest'avventura entrando un po' più nei particolari, cercando di spiegare come affrontare ogni situazione particolare che potremmo incontrare relativamente alla programmazione di applicazioni.

Oggi vedremo come gestire i Layouts, cercheremo in particolare di capire quale scegliere in funzione delle nostre esigenze.

La scelta adeguata del layout, è un'operazione veramente importante, per tanto cerchiamo di fare una distinzione su quelli che sono i Layout disponibili:

  • AbsoluteLayout
  • RelativeLayout
  • LinearLayout
  • FrameLayout
  • TableLayout

Bisogna fare una precisazione: Android non è come iOS, è implementato su dispositivi diversi, che possono avere display di dimensioni diverse; in tal senso, bisogna trovare un modo per far si che i diversi layout si adattino al meglio sui diversi dispositivi in modo automatico, cercando naturalmente di rendere il tutto molto dinamico.

AbsoluteLayout è il più semplice da usare, ma allo stesso tempo è un layout obsoleto in quanto non permette un adattamento preciso sui diversi schermi; settando infatti la dimensione in pixel dei pulsanti, specificando le coordinate tramite ascisse e ordinate, quello che otteniamo è un perfetto layout, anche se statico.

Questo vuol dire che con questa soluzione se il layout venisse visualizzato su un altro dispositivo con uno schermo più piccolo o più grande, l'impaginazione risulterebbe disallineata rispetto all'originale.

La sistemazione dei diversi "pezzi" nel layout avviene mediante layout_x e layout_y, layout_height e layout_width, solitamente tramite l'unità di misura in pixel.

Il pregio di questo layout è sicuramente quello di poter spostare in modo molto comodo i singoli "pezzi", come se lo schermo fosse un campo nel quale ci possiamo spostare, sempre tenendo conto delle coordinate x e y.

LinearLayout è a mio avviso il più usato, ma il suo funzionamento è un po' più complesso da comprendere: letteralmente parlando, dispone ogni elemento su ogni riga se l'attributo orientation dell'elemento è impostato su vertical e su colonna se l'attributo è impostato su horizontal.

Questo significa chiaramente che il layout viene considerato come un "campo" con tanti rettangoli ordinati per riga o colonna, per quanto questa caratteristica sia difficile da gestire, d'altro canto ci permette di rendere il nostro form dinamico, quindi astrarlo dalla dimensione dello schermo, rendendo l'applicazione stessa dinamica.

Per muoverci abbiamo diverse possibilità: se ad esempio creiamo una TextView per visualizzare del Testo, per poter posizionarla come desideriamo, dobbiamo astenerci dal settare coordinate x e y e soprattutto di dimensionare l'area dello stesso, in quanto dobbiamo utilizzare gli attributi di cui abbiamo parlato in precedenza. Per fare questo, utilizziamo degli attributi particolari: per la dimesione della TextView (height, width), utilizzeremo a seconda di quello che ci serve, di wrap_content o fill_parent. Il primo attributo viene utilizzato assegnando una dimensione automatica rispetto al contenuto della TextView, per cui se ad esempio è presente un testo di 20 caratteri, la TextView si adatterà a occupare 20 caratteri, questo vale sia per coordinata X che Y.

L'attributo fill_parent invece, imposta la dimensione massima disponibile dallo schermo, quindi nel caso volessimo utilizzarlo, dobbiamo procedere nel seguente modo:

android:layout_height="fill_parent"

la TextView occuperà quindi tutta l'altezza disponibile, la stessa situazione la otterremmo con layout_width che occuperà quindi tutta la dimensione vista per colonne.

Per spostare la TextView in termini X,Y nel nostro form, dobbiamo ancora una volta astenerci dall'utilizzo dei pixel, in quanto dobbiamo cercare di utilizzare l'attributo gravity.
Se volessimo ad esempio posizionare la TextView sul fondo del nostro layout, aggiungeremo l'attributo gravity in questa maniera:

android:layout_gravity="bottom"

Le opzioni disponibili sono top, bottom, center, right, left, tutte combinabili attraverso l'operatore | che concatenerà le diverse opzioni:

android:layout_gravity="right|bottom"

In questo modo, la nostra TextView andrà sul fondo del layout, verso destra.

Un altro layout manager disponibile è il RelativeLayout che è fondamentalmente un misto tra AbsoluteLayout e LinearLayout,  con la possibilità di utilizzare gli attributi layout_marginLeft e layout_marginRight per impostare banalmente i margini dei diversi oggetti. Sconsiglio però di utilizzarlo perchè ancora una volta dovremmo utilizzare unità di misura in pixel, che come abbiamo visto rendono il nostro Form statico.

FrameLayout, a differenza di quelli visti in precedenza, permette di poter sovrapporre i diversi Content: questo Layout è molto usato per creare piccoli popup o sovrapposizioni varie.

TableLayout invece dispone i componenti in forma tabellare, dividendoli per riga.
Abbastanza scomodo da utilizzare, personalmente l'ho usato pochissimo, ma può funzionare egregiamente per sistemare le immagini o comunque effetti visivi che hanno bisogno di misurazione e posizionamento, magari centrale, qualora vi servissero (cercate di immaginare una griglia per capire com'è ideato).

Una buona scelta tra i diversi layout incrementerà o decrementerà sicuramente l'uso e l'acquisto di una vostra fantomatica applicazione, poichè se questa si adatterà su ogni schermo, la possibilità che venga apprezzata e che gli utenti apprezzino voi per l'ottimo lavoro di programmazione sarà molto più elevata; in caso contrario invece, se effettuerete errori o scelte sbagliate e la vostra applicazione non si adatterà ai tanti schermi presenti nel panorama Android, sarebbe sicuramente alta la possibilità di un flop o comunque una limitazione nella diffusione della .

Non dimenticate che i diversi layout possono essere combinati tra loro.

Terrei a sottolineare un particolare: come unità di misura, qualora sia necessario utilizzarla, consiglio di NON utilizzare i pixel (eccetto particolari usi), ma piuttosto di utilizzare l'unità di misura DIP (appunto della famiglia Display Metrics) dove l'unità di misura è indicata in dots-per-inch (punti per pollice).

Questa unità di misura si adatta MEGLIO rispetto ai pixel, che sono più statici sui diversi schermi, ma globalmente l'obiettivo da tener presente è sicuramente quello di cercare il più possibile di astenersi dai Display Metrics.

Per ogni altra informazione a riguardo vi consiglio di leggere qui, la documentazione è insostituibile rispetto a qualsiasi Tutorial, Guida o quant'altro.

Per la prossima lezione avrei intenzione di trattare i multiforms, quindi il poter gestire più finestre, collegandole tra loro attraverso delle Activity, perchè chiaramente le applicazioni più complesse non lavorano su una sola finestra ma su moltepici.

Voi che ne pensate ? Se avete dubbi o desideraste che tratti un determinato argomento in particolare non esitate a chiedere!