Android – Navigazione TabActivity

Tra i layout disponibili su Android esiste il TabActivity, questo permette di creare una navigazione a tab tra varie finestre. Il suo utilizzo di base non è complicato. I problemi iniziano quando dall’interno di un Tab  si va a richiamare un secondo o un terzo Activity e quindi poi a cercare di ritornare indietro sul primo.Questo post vuole fare chiarezza su questa problematica riportando vari esempi trovati su internet.

Definizione della struttura principale

Come si può vedere dall’immagine affianco, l’applicativo di esempio è molto semplice, consiste in una maschera con tre Tab, in ogni Tab verrà rappresentata una versione più performante per la gestione della navigazione. La creazione della classe che estende TabActivity è identica alla spiegazione sul sito ufficiale link,  e presente nella prima porzione di codice sotto.
La classe Esempio estende TabActivity, nell’evento onCreate, si definiscono via codice (è possibile farlo anche tramite xml), i Tab e l’associazione del Activity da aprire sull’evento di click.

Test Uno

In questo esempio l’apertura di un Activity sugli eventi dei tasti è la classica chiamata :

Intent edit = new Intent(getApplicationContext(),TabActivityTre.class);
startActivity(edit);

E’ ovvio che il risultato è l’apertura dell Activity sull’intera maschera fuori dal contesto del TabActivity, questo esempio mi serve per sperimentare il funzionamento a pila della apertura e chiusura degli Activity. Questo comportamento è gestito in modo automatico in Android.

Come si può vedere dall’esempio via via che chiudo le varie maschere aperte si riapre quella chiamante.

Quello che mi aspettavo, era un identico comportamento nella apertura di più activity all’interno del tab.

Test Due – Apertura degli activity nel contesto del Tab

Procediamo con un altro test, in tanto creiamo una classe che estende un ActivityGroup, che come descrive il link è un uno schermo che contiene e gestisce molteplici activity.

La funzione che vado a chiamare è  getLocalActivityManager() che restituisce un LocalActivityManager , il cui scopo è di aiutare la gestione di multipli activity all’interno del ActivityGroup.

In particolare io utilizzo comunque la proprietà startActivity, che restituisce una Window utilizzata per assegnare alla view della ActivityGroup.

Mentre poi in tutti gli eventi dei vari pulsanti per l’apertura di un nuovo activity eseguo il seguente codice :

L’unica differenza tra le due porzioni di codice è nella chiamata getParent che mi restituisce il contenitore padre che in questo caso è proprio ActivityGroup. Questo mi permette di aprire il secondo Activity sempre al suo interno.

Ma come si può vedere dal filmato successivo appena cerco di tornare al primo Activity aperto tramite un evento di back o una chiamata della funzione finish() mi si chiude definitivamente l’applicativo.

E’ interessante capire il perche, infatti gli eventi che andiamo a chiamare di backpressed non sono dell’activity visualizzato, ma ben si dell ActivityGroup che lo contiene. Quindi è ovvio che l’applicativo si chiuda in quanto ActivityGroup è effettivamente il primo aperto.

Test Tre – Corretta navigazione nei Tab

L’ultima prova che vi presento è in realtà una soluzione accettabile. Tutto si basa sulla seguente estensione della ActivityGroup.

In particolare sfruttando una lista di Stringhe si va a ricreare l’effettuto della gestione a pila di Android a mano. Come potete vedere nell’evento di finishFromChild viene recuperato l’activity precedentemente aperto per poi rivisualizzarlo, evitando di riaprire sempre un nuovo oggetto.

Dopo di che basta estendere questa classe invece dell’ ActivityGroup e il risultato è accettabile.

Abbiamo ancora un problema sempre legato alla gestione del landscape. Appena ruotiamo il cellulare si può notare che viene perso il riferimento all’ activity aperto. Io attualmente ho risolto solo bloccando la possibilità di ruotare l’applicativo.

Link da cui ho preso le informazioni:


Post to Twitter Post to Diigo Post to Facebook Post to FriendFeed Post to Google Buzz Post to LinkedIn