Perché i frammenti e quando utilizzare i frammenti anziché le attività?


485

In Android API 11+, Google ha rilasciato una nuova classe chiamata Fragment.

Nei video, Google suggerisce che quando possibile ( link1 , link2 ), dovremmo usare frammenti invece di attività, ma non hanno spiegato esattamente il perché.

Qual è lo scopo dei frammenti e alcuni possibili utilizzi di essi (oltre ad alcuni esempi dell'interfaccia utente che possono essere facilmente raggiunti da semplici viste / layout)?

La mia domanda riguarda i frammenti:

  1. Quali sono gli scopi dell'utilizzo di un frammento?
  2. Quali sono i vantaggi e gli svantaggi dell'utilizzo dei frammenti rispetto all'utilizzo di attività / viste / layout?

Domande bonus:

  1. Puoi dare degli usi davvero interessanti per i frammenti? Cose che Google non ha menzionato nei loro video?
  2. Qual è il modo migliore per comunicare tra i frammenti e le attività che li contengono?
  3. Quali sono le cose più importanti da ricordare quando si usano i frammenti? Qualche consiglio e avvertimento dalla tua esperienza?


Risposte:


282

# 1 e # 2 quali sono gli scopi dell'utilizzo di un frammento e quali sono i vantaggi e gli svantaggi dell'utilizzo dei frammenti rispetto all'utilizzo di attività / viste / layout?

I frammenti sono la soluzione di Android per la creazione di interfacce utente riutilizzabili. Puoi ottenere alcune delle stesse cose usando attività e layout (ad esempio usando include). Però; i frammenti sono collegati all'API Android, da HoneyComb e versioni successive. Lasciami elaborare;

  • Il ActionBar. Se vuoi le schede lassù per navigare nella tua app, vedi rapidamente che l' ActionBar.TabListenerinterfaccia ti fornisce FragmentTransactionun argomento come input per il onTabSelectedmetodo. Probabilmente potresti ignorarlo e fare qualcos'altro e intelligente, ma lavoreresti contro l'API, non con essa.

  • Le FragmentManagermaniglie «indietro» per te in un modo molto intelligente. Indietro non significa ritorno all'ultima attività, come per le attività regolari. Significa tornare allo stato precedente del frammento.

  • Puoi usare il cool ViewPagercon a FragmentPagerAdapterper creare interfacce swipe. Il FragmentPagerAdaptercodice è molto più pulito di un normale adattatore e controlla le istanze dei singoli frammenti.

  • La tua vita sarà molto più semplice se usi Frammenti quando provi a creare applicazioni per telefoni e tablet. Poiché i frammenti sono così legati alle API Honeycomb +, dovrai usarli anche sui telefoni per riutilizzare il codice. È qui che la libreria di compatibilità è utile.

  • Potresti e dovresti anche usare frammenti per app pensate solo per telefoni. Se hai in mente la portabilità. Io uso ActionBarSherlocke le librerie di compatibilità per creare app "ICS looking", che sembrano uguali alla versione 1.6. Ottieni le ultime funzionalità come ActionBar, con schede, overflow, barra delle azioni divisa, viewpager ecc.

Bonus 2

Il modo migliore per comunicare tra i frammenti sono gli intenti. Quando si preme qualcosa in un frammento, in genere si chiama StartActivity()con i dati su di esso. L'intento viene trasmesso a tutti i frammenti dell'attività avviata.


5
prima di tutto, grazie. Apprezzo le persone che danno risposte informative (ma brevi) e non mi danno solo un link a un manuale. In ogni caso, oltre alle funzionalità extra per lavorare su classi speciali, puoi pensare a vantaggi e svantaggi di lavorare con i frammenti ?
sviluppatore Android

4
Penso che devi essere più diretto nelle tue domande. Ho appena dato quattro vantaggi principali sopra.
Glenn Bech,

2
ok, che dire degli svantaggi rispetto alle visualizzazioni e alle attività personalizzate?
sviluppatore Android

2
come comunichi tra i frammenti usando gli intenti? tutti i frammenti devono essere "vivi" (aggiunti all'attività) in modo che possano comunicare tra loro?
sviluppatore Android

55
Un frammento non dovrebbe mai parlare direttamente con un altro frammento, invece passa attraverso l'attività genitore. In questo modo non si arriva al codice spaghetti ma al codice facile da gestire.
Slott

70

Non sono sicuro dei video a cui ti riferisci, ma dubito che stiano dicendo che dovresti usare i frammenti anziché le attività, perché non sono direttamente intercambiabili. C'è in realtà una voce abbastanza dettagliata nella Guida agli sviluppatori, considera la lettura per i dettagli.

In breve, i frammenti vivono all'interno delle attività e ogni attività può ospitare molti frammenti. Come le attività, hanno un ciclo di vita specifico, a differenza delle attività, non sono componenti applicativi di alto livello. I vantaggi dei frammenti includono il riutilizzo del codice e la modularità (ad esempio, utilizzando la stessa visualizzazione elenco in molte attività), inclusa la possibilità di creare interfacce multi-riquadro (utile soprattutto sui tablet). Lo svantaggio principale è (in parte) maggiore complessità. In genere è possibile ottenere lo stesso risultato con visualizzazioni (personalizzate) in un modo non standard e meno robusto.


1
domanda aggiornata. ora ha collegamenti ai video di google. inoltre, grazie per la spiegazione, ma ho ancora bisogno di chiarimenti sulla mia domanda.
sviluppatore Android

5
Leggi la voce guida dev, ha più che sufficienti dettagli. È improbabile che tu possa ottenere una risposta a "fantastici usi di frammenti" su SO - modo vago e non esiste una risposta unica. Al numero 4 viene data una risposta specifica nella guida per gli sviluppatori-- developer.android.com/guide/topics/fundamentals/…
Nikolay Elenkov

1
per quanto ne so, questo metodo crea una dipendenza di quale attività può contenere quale frammento. inoltre, rispondi alle domande principali (le prime due).
sviluppatore Android

3
Grazie allo sviluppatore Android per aver insistito sulle risposte alla domanda di base. ATM Non ho visto nulla di utile per me nella classe Fragment rispetto all'uso del tag XML "include". Il tipo di cose che troverei preziose sarebbe la capacità di specificare un layout che magicamente si trasformerebbe nella migliore esperienza utente a tutte le risoluzioni. Da quello che posso dire è ancora necessario farlo da soli nel codice. Un altro potenziale valore sarebbe un modo per raggruppare codice + risorse in componenti riutilizzabili che non si trovano nelle app di riutilizzo, ma di nuovo non sembra essere lì. Voglio una ragione davvero buona.
Melinda Green,

2
Sto iniziando a capire come Google suggerisce di usare i frammenti, ma sono abbastanza d'accordo con @NikolayElenkov .. Per me, l'utilizzo delle attività sembra essere ancora il modo più robusto e meno complesso ..
andrea.rinaldi

49

Un frammento è un pezzo dell'interfaccia utente o del comportamento di un'applicazione che può essere inserito in un'attività che consente una progettazione di attività più modulare. Non sarà sbagliato se diciamo che un frammento è una specie di sottoattività.

Di seguito sono riportati alcuni punti importanti su un frammento:

  1. Un frammento ha il suo layout e il suo comportamento con i suoi callback del ciclo di vita.

  2. È possibile aggiungere o rimuovere frammenti in un'attività mentre l'attività è in esecuzione.

  3. È possibile combinare più frammenti in un'unica attività per creare un'interfaccia utente a più riquadri.

  4. Un frammento può essere utilizzato in più attività.

  5. Il ciclo di vita del frammento è strettamente correlato al ciclo di vita della sua attività ospite.

  6. Quando l'attività viene messa in pausa, anche tutti i frammenti disponibili nell'attività verranno arrestati.

  7. Un frammento può implementare un comportamento che non ha componenti dell'interfaccia utente.

  8. Frammenti sono stati aggiunti all'API Android in Android 3 (Honeycomb) con API versione 11.

Per maggiori dettagli, visita il sito ufficiale, Frammenti .


1. Come hai detto in 8, non deve avere un layout. 6. hai perso la parte dopo "significa". Comunque, grazie per aiutare gli altri a renderlo più chiaro. Ti darò +1.
sviluppatore Android

1
Per quanto riguarda # 8, un possibile esempio di frammento senza layout (cioè frammento "senza testa") sarebbe quello che svolge un'attività che, nonostante sia un po 'breve (come una richiesta HTTP breve) è ancora necessaria per sopravvivere alle modifiche della configurazione e quindi dipende sull'istanza esatta del frammento che viene conservata su di essi (utilizzando setRetainInstance (true) sul frammento). Per quanto riguarda i frammenti di layout, setRetainInstance (true) non ha molto senso, in quanto impedisce che le risorse associate alle loro viste vengano liberate quando necessario (cioè una perdita di memoria).
Piovezan,

NOTA: "# 8" è ora "# 7".
ToolmakerSteve

21

Queste sono informazioni importanti che ho trovato sui frammenti:

Storicamente ogni schermata in un'app Android è stata implementata come un'attività separata. Ciò crea una sfida nel passaggio di informazioni tra schermate poiché il meccanismo Intento di Android non consente il passaggio di un tipo di riferimento (ovvero oggetto) direttamente tra le attività. Invece l'oggetto deve essere serializzato o reso disponibile un riferimento accessibile a livello globale.

Trasformando ogni schermo in un frammento separato, questi mal di testa che passano dati vengono completamente evitati. I frammenti esistono sempre nel contesto di una determinata attività e possono sempre accedere a tale attività. Memorizzando le informazioni di interesse all'interno dell'Attività, il Frammento per ogni schermata può semplicemente accedere al riferimento all'oggetto tramite l'Attività.

Fonte: https://www.pluralsight.com/blog/software-development/android-fragments


3
È vero, ma ci sono soluzioni per questo: usa Parcelable quando non è un oggetto enorme (e c'è un plugin per renderlo più facile), e se è un oggetto enorme, puoi sempre usare un riferimento statico che sarà impostato su null quando arrivi alla nuova attività (o quando la distruggi, a seconda delle tue esigenze).
Sviluppatore Android

@androiddeveloper: "usa Parcelable" si adatta alla mia definizione di "mal di testa che passa dati che viene evitato usando i frammenti". Se esiste uno stato condiviso complesso che deve persistere mentre passa una serie di schermate, un Activity + Frammenti è una buona soluzione, IMHO. (Anche se ho abbandonato la pila avanti Frammento, e fatto la mia gestione di cosa significa "indietro".)
ToolmakerSteve

L'uso del modello di progettazione dell'interfaccia tra i frammenti attraverso un'attività del contenitore è un approccio molto modulare per trasmettere non solo oggetti ma anche fare clic su listener di eventi e argomenti del metodo su altri frammenti o sull'attività principale del contenitore.
Kaveesh Kanwal,

10

Le attività sono i componenti a schermo intero nell'app con la barra degli strumenti, tutto il resto sono preferibilmente frammenti. Un'attività padre a schermo intero con una barra degli strumenti può avere più riquadri, pagine scorrevoli, finestre di dialogo, ecc. (Tutti i frammenti), a cui è possibile accedere dal genitore e comunicare tramite il genitore.

Esempio:

Attività A, Attività B, Attività C:

  • Tutte le attività devono avere lo stesso codice ripetuto, ad esempio per mostrare una barra degli strumenti di base o ereditare da un'attività principale (diventa ingombrante da gestire).
  • Per passare da un'attività all'altra, devono essere tutti in memoria (sovraccarico) o uno deve essere distrutto perché l'altro si apra.
  • La comunicazione tra le attività può essere effettuata tramite Intenti.

vs

Attività A, Frammento 1, Frammento 2, Frammento 3:

  • Nessuna ripetizione del codice, tutte le schermate hanno barre degli strumenti ecc. Di quell'unica attività.
  • Diversi modi per passare da un frammento al successivo: visualizza cercapersone, multi riquadro ecc.
  • L'attività ha la maggior parte dei dati, quindi è necessaria una comunicazione tra frammenti minima. Se ancora necessario, può essere fatto facilmente tramite interfacce.
  • I frammenti non devono necessariamente essere a schermo intero, molta flessibilità nel progettarli.
  • I frammenti non devono gonfiare il layout se le viste non sono necessarie.
  • Diverse attività possono utilizzare lo stesso frammento.

risposta perfetta!
Sathesh,

8

I frammenti sono di particolare utilità in alcuni casi come dove vogliamo mantenere un cassetto di navigazione in tutte le nostre pagine. Puoi gonfiare il layout di una cornice con qualunque frammento tu voglia e avere comunque accesso al cassetto di navigazione.

Se avessi usato un'attività, avresti dovuto tenere il cassetto in tutte le attività che rendono il codice ridondante. Questo è un uso interessante di un frammento.

Sono nuovo su Android e continuo a pensare che un frammento sia utile in questo modo.


Sì. Tuttavia, a volte sono ancora confuso sul modo corretto di usare i frammenti, e questo è dovuto al complesso ciclo di vita di entrambi i frammenti e le attività.
sviluppatore Android il

@androiddeveloper usi principalmente le attività?
Michael Alan Huff,

@MichaelAlanHuff Quando sostengo i tablet, penso che sia meglio usare Fragments. Inoltre, quando supporti i cambiamenti di orientamento e altri eventi simili, potresti voler usare DialogFragment, in quanto ti consente di ripristinarli
sviluppatore Android

@androiddeveloper, è quello che penso anche io. Non ho usato DialogFragments così spesso. Per aiutare la modularità della logica, molti sviluppatori Android stanno iniziando a utilizzare viste personalizzate per contenere la logica come un mortaio. Ecco un recente discorso sulle opinioni personalizzate tenuto da un ingegnere di Airbnb vimeo.com/127799187
Michael Alan Huff,

@MichaelAlanHuff usare i frammenti potrebbe essere utile anche se pensi che la schermata corrente possa far parte di un'altra schermata.
sviluppatore Android

5

So che questo è già stato discusso a morte, ma vorrei aggiungere altri punti:

  • I frags possono essere usati per popolare Menue possono gestire i MenuItemclic da soli. Fornendo così ulteriori opzioni di modulazione per le tue attività. Puoi fare cose ContextualActionBar e così via senza che la tua Attività lo sappia e fondamentalmente puoi separarlo dalle cose di base che la tua Attività gestisce (Navigazione / Impostazioni / Informazioni).

  • Un Frag padre con Frags figlio può darti ulteriori opzioni per modulare i tuoi componenti. Ad esempio, puoi facilmente scambiare le Frags in giro, mettere nuove Frags all'interno di una Pager o rimuoverle, riorganizzarle. Tutto senza che la tua attività ne sappia nulla, concentrandosi solo sulle cose di livello superiore.


0

Frammenti vive all'interno dell'attività e ha:

  • il proprio ciclo di vita
  • il suo layout
  • i suoi frammenti di figlio e così via

Pensa ai frammenti come una sub attività dell'attività principale a cui appartiene, non può esistere da sola e può essere chiamata / riutilizzata ancora e ancora. Spero che sia di aiuto :)


In realtà, circa il secondo punto ("il suo layout"), questo è facoltativo. Un frammento non deve assolutamente avere una vista.
sviluppatore Android

0

1. Scopo dell'utilizzo di un frammento?

  • Ans:
    1. Gestione delle differenze tra i fattori di forma del dispositivo.
    2. Passando informazioni tra le schermate delle app.
    3. Organizzazione dell'interfaccia utente.
    4. Metafore avanzate dell'interfaccia utente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.