Frammento o frammento di supporto?


125

Sto sviluppando un'app che supporta Android> = 4.0. Utilizza frammenti dal android.apppacchetto. Poiché sto riscontrando problemi con l'implementazione del frammento precedente in 4.0, come questa , che sono già stati risolti nella libreria di supporto, sto prendendo in considerazione il passaggio all'implementazione del frammento dalla libreria di supporto per ottenere un'implementazione più affidabile e coerente.

Qual è la tua opinione su questo? Stai usando frammenti dalla libreria di supporto, anche se sono già disponibili, durante lo sviluppo per Android 4?


2
Questa è una bella domanda (+1 perché mi incuriosisce). Inoltre non c'è una buona spiegazione sul web per questo. Sto usando la libreria di supporto per la mia app e mi chiedo se sbaglio o no, perché non ho notato alcun errore durante la compilazione o durante il test.
JJ86,

2
@animuson La risposta di brillenheini dimostra che questa non è principalmente una risposta basata sull'opinione.
OneWorld,

Risposte:


90

Dalla mia esperienza, l'utilizzo della stessa implementazione di frammenti su tutti i dispositivi Android è un grande vantaggio. Non riuscivo a sbarazzarmi di tutte le NullPointerExceptions quando lo stato veniva salvato su Android 4.0 usando frammenti nativi, con la libreria di supporto sono tutti spariti. Inoltre non ho potuto vedere alcuno svantaggio finora con questo approccio.

Quindi la mia risposta alla mia domanda è ora: quando si sviluppa per Android 4.x, è consigliabile utilizzare i frammenti della libreria di supporto. Nella libreria di supporto sono stati corretti i bug che sono ancora presenti nelle implementazioni di frammenti precedenti e viene frequentemente aggiornato con più correzioni di bug.


11
Allora, qual è lo scopo di android.app.Fragmentallora? Se riesci ad aggiungere questo alla tua risposta qui con qualche spiegazione in più, sarei pienamente soddisfatto. Grazie!
jonstaff,

1
@jonstaff Il motivo è probabilmente storico. Vedi la mia risposta aggiornata lì.
brillenheini,

11
Per completezza, sembrano esserci cose che i frammenti di supporto non possono fare (ad es. Essere animati conobjectAnimator , anche se il sistema operativo target attuale lo supporta). Il che, nel caso in cui si stia utilizzando ViewPager, significa che è necessario utilizzare gli adattatori dalla libreria di supporto v13, altrimenti non è possibile avere sia viewpager sia l'animazione di lancio.
GSerg,

5
Inoltre, a partire da agosto 2014, la libreria v13 non può eseguire frammenti nidificati.
Martin Marconcini,

1
Perché i ragazzi di google hanno optato per l'uso della libreria v13 per l'app iosched github.com/google/iosched/blob/master/android/src/main/java/com/… , devono avere qualche motivo
Forcewill

40

Un grande motivo per rimanere con il SupportFragmentper un po 'è che non si ha accesso ChildFragmentManagerall'API fino al 17. La libreria di supporto ti fornirà una versione di supporto del gestore di frammenti figlio.

Questo diventa un grosso problema se hai frammenti che contengono altri frammenti. Questo è comune nelle applicazioni tablet con una buona complessità e / o la tua architettura complessiva si basa su un layout a schede o utilizza il cassetto di navigazione.


21

Mi sentivo anche frustrato nel dover includere le librerie di supporto, nonostante il targeting per Android 4.0+ - ma sembra che sia ufficialmente raccomandato:

Il pacchetto Libreria di supporto Android contiene diverse librerie che possono essere incluse nella tua applicazione. Ognuna di queste librerie supporta una gamma specifica di versioni della piattaforma Android e un set di funzionalità.

Questa guida spiega le funzionalità importanti e il supporto della versione fornito dalle Librerie di supporto per aiutarti a decidere quale di esse dovresti includere nella tua applicazione. In generale, si consiglia di includere il supporto v4 e le librerie di app v7, poiché supportano una vasta gamma di versioni di Android e forniscono API per i modelli di interfaccia utente consigliati.

http://developer.android.com/tools/support-library/features.html


Questa dovrebbe essere la risposta accettata, nonostante il fatto che @brillenheini abbia fornito una risposta autonomamente. Risponde alla domanda con la massima accuratezza e concisione.
Arvindh Mani,

4

Se ho intenzione di sviluppare solo per 4.0, consiglierei di andare con le librerie native poiché l'eseguibile diventerà più piccolo. È vero che potresti riscontrare problemi di bug nelle prime versioni, ma penso che la maggior parte di questi dovrebbe essere abbastanza banale da aggirare. Inoltre, la libreria di compatibilità dovrebbe essere mappata ai frammenti nativi nel caso in cui si esegua comunque su 4.0 e versioni successive. Quindi potresti finire per dover lottare con questo tipo di problemi comunque. Il problema con le librerie di supporto è che molte classi appaiono 2x (una volta nella struttura del pacchetto di supporto e una volta nella struttura del pacchetto "nativo"), il che rende lo sviluppo un po 'più complicato.

Tuttavia, se desideri rilasciare anche la tua app pre 4.0, non è possibile aggirare la libreria di supporto. Inoltre, dato che ci sono circa il 38% di tutti gli utenti su 2.3, potrebbe essere utile includere questa versione del sistema operativo. In tal caso è possibile utilizzare la libreria di supporto in combinazione con ActionBarSherlock di Jake Wartons (o con la libreria ActionBar di supporto di Google una volta che è stato finalmente rilasciato).


3
Grazie per la tua risposta. Poiché ho bisogno di ViewPager, devo comunque includere la libreria di supporto. Inoltre, il frammento di supporto non tenta di passare all'implementazione nativa, se disponibile. Questo è ciò che dicono i documenti .
brillenheini,

Sì, il fatto è (come ha detto @brillenheini) che per avere il ViewPager hai bisogno della v4, quindi anche se stai prendendo di mira solo i dispositivi v13 + probabilmente finirai di avere la v4 comunque.
Sotti,

L'ho appena scoperto (ViewPager necessita della v4) sulla mia API 21 e sull'app. Meh: - /
mraviator

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.