2012-02-01 11 views
7

Prima domanda su Stack Overflow, scuse se non è ben formato.Android: come creare un'app complessa con schede con viste

Sto sviluppando un'applicazione con schede relativamente complessa e ho già impostato le nozioni di base prima di ottenere informazioni su ActivityGroup e TabActivity deprecate e il modello preferito è utilizzare le visualizzazioni.

Non ho avuto problemi nell'utilizzo delle viste, questa è una domanda sull'architettura piuttosto che sulla sintassi (motivo per cui non ho pubblicato alcun codice). Nello specifico, , come dovrei procedere a ristrutturare l'app per utilizzare le visualizzazioni anziché le attività avviate in corso.

L'app ha cinque schede; due tengono un unico layout, nessun problema lì. Le altre tre schede eseguono un gruppo attività con 2-5 diverse attività (ad esempio una scheda che esegue un'attività per le impostazioni, dove facendo clic su ogni vista si avvia una nuova attività che tratta quella particolare impostazione, premendo il pulsante indietro si ritorna alle impostazioni/attività di visualizzazione più ampie). Se dovessi mantenere ogni Tab come TabActivity, sarebbe comunque abbastanza facile cambiare le transizioni interne in viste anziché in attività separate.

La domanda principale consiste nell'utilizzare SOLO visualizzazioni, nessun gruppo TabActivity/Activity. La stragrande maggioranza della ricerca che ho fatto è stata la discussione sull'opportunità di utilizzare le attività o le viste o sulla sintassi specifica. Non sono stato in grado di raccogliere una chiara idea di come REALMENTE realizzare la transizione alle visualizzazioni attraverso l'intera applicazione.

  1. Se dovessi farlo, non sarebbe l'intera applicazione ora essere in esecuzione in una sola attività - quello che ospita il layout a schede?

  2. Se (1) è vero, come gestirlo? Nonostante la deprecazione di ActivityGroup, tutta la documentazione di Android sembra ancora affermare che è preferibile utilizzare attività separate per aspetti separati della funzionalità, il che ha senso. Il team di sviluppo di Android ha semplicemente deciso che i costi dello stack e del dispositivo hanno reso l'implementazione di TabActivity inefficace?

  3. Se l'applicazione è in esecuzione in una singola attività che gestisce visualizzazioni diverse per ogni scheda (e quindi diverse viste ENTRO una scheda quando necessario), dovrei avere un unico enorme metodo onClick per gestire tutti i clic da qualsiasi vista selezionabile, gestire l'input in base a quale vista è attiva? O dovrei registrare e de-registrare tutti i miei ascoltatori programmaticamente?

  4. Con una sola attività, nessun ascoltatore di clic o qualsiasi ricevitore di trasmissione è in esecuzione tutto il tempo, consumando risorse anche quando non necessarie?

  5. Con una singola attività, il pulsante Indietro uscire dall'intera applicazione da qualsiasi punto della sua funzionalità. Se sto usando le viste, non dovrò sovrascrivere in modo consistente suBackPressed() e gestire attentamente il comportamento dell'app per costringerlo a comportarsi "come un'app Android?"

  6. AM PENSO COMPLETAMENTE SBAGLIATO? È possibile che io stia tentando involontariamente di ricreare la funzionalità ActivityGroup e TabActivity usando invece le viste, quando dovrei adottare un approccio progettuale completamente diverso all'utilizzo delle schede e delle viste.

Quando il popolo di Google dicono che non dovremmo usare attività come schede più, e il signor Mark Murphy si impegna con tanta enfasi, io sono propenso a credere.Semplicemente non sono stato in grado di cercare un modo per passare senza ricorrere a ricreare molte funzionalità di Activity a mano (che probabilmente includerebbe una varietà di hack sporchi).

Apprezzamento anticipato per chiunque voglia affrontare un argomento così vago e sovrascritto.

+1

davvero ottima domanda ... benvenuti a Stack. –

risposta

2

L'utilizzo di Fragments è il nuovo standard per l'esecuzione di componenti dell'interfaccia utente in stile con tabulazione, penso che sia necessario averli trascurati perché sono il pezzo mancante di tutte le domande precedenti. In bocca al lupo.

Non dimenticare che l'utilizzo della libreria di compatibilità porta il supporto di Fragment fino alla 1.6.

E here è un semplice tutorial di Google consigliato sull'utilizzo di Frammenti all'interno di un TabHost.

+0

Hai ragione, ho completamente trascurato i frammenti. Molto utile, grazie. – HeMightBeTodd

+0

@HendlerExploit, se sto capendo correttamente la documentazione dei frammenti, non vogliamo utilizzare attività separate per ogni scheda, ma * È * considerato un buon progetto per utilizzare frammenti separati per ciascun componente di funzionalità separato? – HeMightBeTodd

+0

Corretto, i frammenti possono essere trattati come un gruppo di core logic. Non diversamente da un'attività, ma con Frammenti è possibile limitare la duplicazione del codice riutilizzando gli stessi frammenti in luoghi diversi. – HandlerExploit

1

Informazioni 3) La tua app è suddivisa in tante attività quante sono le diverse parti dell'app. Oggi andrei anche su Fragements che può essere più facilmente composto in diversi layout quando ad es. crea l'app per telefono e tablet. maggior parte del tempo, si può semplicemente impostare le onClick ascoltatori nei file di definizione di layout xml rispettivi come questo:

<ImageButton 
    android:id="@+id/new_tweet_back_button" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_gravity="left" 
    android:onClick="done" 
    android:src="@drawable/back_button" 
    android:layout_below="@id/CharCount" 
     /> 

Qui i punti attributo a un metodo che implementa il gestore. Non è necessario annullare la registrazione di nulla.

E invece di schede mi piacerebbe andare per la ViewPager che rende imo un'esperienza molto più naturale con solo lo scambio di vedute scorrendo a destra ea sinistra (si veda ad esempio G + app o app di mercato)

+0

Suppongo di aver lasciato questo fuori dalla domanda iniziale: la maggior parte della mia gestione dei clic viene eseguita attraverso metodi dichiarati via android: onClick nel layout xml. In questo caso, gli ascoltatori sono attivi solo quando il file pertinente è stato chiamato con setContent() o setContentView(), in modo da non doverlo preoccupare diversamente? – HeMightBeTodd

+0

Sì - ed è anche possibile utilizzare un metodo per più elementi dell'interfaccia utente: si ottiene la 'vista di chiamata' passata come argomento. –

+0

In questo caso, se dichiaro Android: onClick = "myClickHandler" su più viste, lo stesso myClickHandler (View v) sarà chiamato da tutti loro, passando nella vista appropriata? – HeMightBeTodd

0

Come una risposta definitiva a la mia domanda:

Utilizzo di frammenti nelle schede DID risolvere tutto il problema precedente.

Quindi, anziché un'attività che definisce schede contenenti altre attività, ho una FragmentActivity grande che imposta e modifica le viste dei vari frammenti. I metodi click definiti nell'XML per ogni tab view appartengono a FragmentActivity, e ho optato per fare in modo che ogni chiamata onClick abbia un metodo corrispondente nel frammento appropriato (passando un contesto se necessario) in modo che il codice per manipolare ogni vista in modo programmatico possa rimanere nel classe appropriata.

QUESTO E 'PER UN TELEFONO UTILIZZANDO IL PACCHETTO DI COMPATIBILITÀ, non un tablet o Honeycomb, quindi non posso parlare per quelli sfortunatamente.

Questa soluzione sembra aver funzionato bene per me. Raccomando a chiunque guardando lo stesso problema di controllare:

thepsuedocoder post sul blog: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

documentazione Android su Frammenti: http://developer.android.com/guide/topics/fundamentals/fragments.html

L'API demo "Frammento Spartiti" http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment

Problemi correlati