Dilemma: quando utilizzare frammenti vs attività:

So che le Activities sono progettate per rappresentare un singolo schermo della mia applicazione, mentre i Fragments sono progettati per essere riutilizzabili layout UI con logica incorporata all'interno di essi.

Fino a poco tempo fa, ho sviluppato un'applicazione in quanto ha detto che dovrebbero essere sviluppati. Ho creato un'attività per rappresentare uno schermo della mia applicazione e ho usato frammenti per ViewPager o Google Maps . Ho raramente creato un ListFragment o un altro UI che può essere riutilizzato più volte.

  • Android: Come interfacersi con Google Calendar?
  • Come fare il button di lavoro per il caricamento in un'applicazione android?
  • Problema di rendering WebView in Android KitKat
  • Callback di servizio remoto Android
  • SkImageDecoder :: La fabbrica ha restituito null
  • In Android, c'è un modo per get la corrente della batteria?
  • Recentemente mi sono imbattuto in un progetto che contiene solo 2 Activities una è una SettingsActivity e l'altra è la MainActivity . Il layout della MainActivity è popolato con molti frammenti UI a schermo integer nascosto e solo uno viene mostrato. Nella logica di Acitivty esistono molti FragmentTransitions tra i vari schermi dell'applicazione.

    Quello che mi è piaciuto di questo approccio è che, perché l'applicazione utilizza un ActionBar , rimane intatto e non si muove con l'animation di commutazione dello schermo, cosa che accade con la commutazione di Activity . Questo dà una sensazione più fluente a quelle transizioni dello schermo.

    Quindi, indovino quello che chiedo è di condividere la tua attuale modalità di sviluppo in merito a questo argomento, so che potrebbe sembrare una domanda di opinione a prima vista, ma lo considero come una domanda di design e architettura Android … basato su una opinione.

    AGGIORNAMENTO (01.05.2014): Dopo questa presentazione di Eric Burke da Square , (che devo dire è una grande presentazione con molti strumenti utili per gli sviluppatori androidi e non sono affatto legato a Square)

    http://www.infoq.com/presentations/Android-Design/

    Dalla mia esperienza personale negli ultimi mesi ho scoperto che il modo migliore per build le mie applicazioni è creare gruppi di frammenti che rappresentano un stream nell'applicazione e presentano tutti quei frammenti in un'attività. Quindi fondamentalmente avrai lo stesso numero di Activities nella tua applicazione come il numero di flussi. In questo modo la barra d'azione rimane intatta su tutti gli schermi del stream, ma viene ricreata sul cambiamento di un stream che ha molto senso. Come afferma Eric Burke e come ho capito, la filosofia di utilizzare le Activities less possibili non è applicabile in tutte le situazioni perché crea un disordine in quello che definisce l'attività "di Dio".

  • Convertire Json in un object in Android con gson
  • Distriggersre la memorizzazione nella cache, i cookie e tutto il resto in un WebView
  • Android GoogleMap 2 aggiornano le informazioni dynamicmente in InfoWindow con ImageView tramite il caricatore di immagini Universal
  • android.database.sqlite.SQLiteDatabase.rawQuery () non aggiorna una colonna DATETIME con una function datetime () SQLite
  • Calendario di Android Gli events ricorrenti hanno la data / ora di fine errata
  • Android: Creazione di un TextView circolare?
  • 12 Solutions collect form web for “Dilemma: quando utilizzare frammenti vs attività:”

    Gli esperti ti diranno: "Quando vedo l'UI, saprò se utilizzare un'attività o un Fragment ". All'inizio questo non avrà senso, ma in tempo potrai capire se hai bisogno di un Fragment o less.

    C'è una buona pratica che ho trovato molto utile per me. Mi è accaduto mentre stavo cercando di spiegare qualcosa a mia figlia.

    Vale a dire, immagina una scatola che rappresenta uno schermo. Puoi caricare un'altra schermata in questa casella? Se utilizzi una nuova casella, dovrai copiare più elementi dalla prima casella? Se la risposta è Sì, è necessario utilizzare i Fragments perché l' Activity principale può contenere tutti gli elementi duplicati per risparmiare tempo nella creazione e puoi semplicemente sostituire parti della casella.

    Ma non dimenticate di aver sempre bisogno di un contenitore di box ( Activity ) o le vostre parti saranno disperse. Così una scatola con parti all'interno.

    Fare attenzione a non abusare la scatola. Gli esperti di Android UX consigliano (li puoi trovare su YouTube) quando dovremmo esplicitamente caricare un'altra Activity , invece di utilizzare un Fragment (come quando ci occupiamo del cassetto di navigazione che dispone di categorie). Una volta che ti senti a proprio agio con i Fragments , puoi guardare tutti i tuoi video. Ancor più sono materiale obbligatorio.

    Puoi guardare al tuo UI ora e capire se hai bisogno di un'attività o di un Fragment ? Hai ottenuto una nuova prospettiva? Credo di averlo fatto.

    La mia filosofia è questa:

    Creare un'attività solo se è assolutamente necessario. Con il backstack messo a disposizione per commettere un gruppo di transactions di frammento, cerco di creare come minimo le attività nella mia app come ansible. Inoltre, la comunicazione tra vari frammenti è molto più semplice, piuttosto che submit dati avanti e indietro tra le attività.

    Le transizioni di attività sono costose, giusto? Alless credo – perché la vecchia attività da distruggere / mettere in pausa / fermarsi, spinto sulla pila e poi la nuova attività deve essere creata / iniziata / ripresa.

    È solo la mia filosofia da quando sono stati introdotti frammenti.

    Beh, secondo le conferenze di Google (forse qui , non ricordo), dovresti considerare l'utilizzo di frammenti each volta che è ansible, in quanto rende il codice più semplice da mantenere e controllare.

    Tuttavia, penso che in alcuni casi possa diventare troppo complessa, poiché l'attività che ospita i frammenti ha bisogno di navigare / comunicare tra di essi.

    Penso che dovresti decidere da soli quello che è meglio per te. Di solito non è difficile convertire un'attività in un frammento e viceversa.

    Ho creato un post su questo dillema qui , se vuoi leggere di più.

    Perché preferisco il frammento di attività in tutti i casi.

    • L'attività è costosa. Nel frammento, le viste e gli stati delle properties; sono separate – each volta che un frammento è in backstack , le sue opinioni saranno distrutte. Quindi puoi impilare più frammenti di attività.

    • Manipolazione del Backstack . Con FragmentManager , è facile rimuovere tutti i frammenti, inserendo più di Fragments e etcs. Ma per attività, sarà un incubo per manipolare quelle cose.

    • Un ciclo di vita molto prevedibile. Finché l'attività host non viene riciclata. i frammenti nel backstack non saranno riciclati. Quindi è ansible utilizzare FragmentManager::getFragments() per trovare un frammento specifico (non incoraggiato).

    C'è molto di più di quanto si renda conto, bisogna ricordare che un'attività che viene lanciata non distrugge implicitamente l'attività chiamante. Certamente, puoi impostarla in modo tale che l'utente fa clic su un button per passare a una pagina, inizia l'attività della pagina e distrugga quella corrente. Ciò causa un sacco di overhead. La migliore guida che posso darti è:

    ** Avviare una nuova attività solo se ha senso avere l'attività principale e questo aprire contemporaneamente (pensate a più windows).

    Un grande esempio di quando ha senso avere più attività è Google Drive. L'attività principale fornisce un file explorer. Quando viene aperto un file, viene avviata una nuova attività per visualizzare tale file. Puoi premere il button app recente che ti permetterà di tornare al browser senza chiudere il documento aperto, forse anche aprire un altro documento in parallelo al primo.

    A mio avviso non è per niente importnte. Il fattore chiave da considerare è

    1. quanto spesso si riusano a riutilizzare parti dell'interface utente (menù ad esempio),
    2. è l'applicazione anche per le tavolette?

    L'utilizzo principale dei frammenti è quello di build attività multilivello, che lo rendono perfetto per applicazioni tablet / telefono sensibili.

    Cosa che ho fatto: usando less frammentazione quando ansible. Purtroppo, è ansible in quasi caso. Quindi finisco con un sacco di frammenti e un po 'di attività. Alcuni inconvenienti che ho realizzato:

    • ActionBar & Menu: Quando 2 frammenti hanno un titolo diverso, menu, quello
      sarà difficile da gestire. Es: quando si aggiunge un nuovo frammento, è ansible modificare il titolo della barra d'azione, ma quando lo backstack dal backstack non è ansible ripristinare il vecchio titolo. Potrebbe essere necessario una barra degli strumenti in each frammento per questo caso, ma lasciathemes credere, che ti spenderà più tempo.
    • Quando abbiamo bisogno di startForResult , l'attività ha solo frammento non lo è.
    • Per impostazione predefinita non si dispone dell'animation di transizione

    La mia soluzione per questo è l'utilizzo di un'attività per avvolgere un frammento all'interno. Quindi abbiamo barra d'azione separata, menu, startActivityForResult , animation, …

    Non dimenticare che un'attività è block / componente dell'applicazione che può essere condivisa e avviata tramite Intent! Quindi each attività nella tua applicazione dovrebbe risolvere un solo tipo di task. Se hai un'unica attività nell'applicazione, credo di aver bisogno solo di un'attività e di molti frammenti se necessario. Naturalmente puoi riutilizzare frammenti nelle attività future che risolvono altri compiti. Questo approccio sarà una chiara e logica separazione dei compiti. E non è necessario mantenere un'attività con diversi parametri del filter di intenti per diversi set di frammenti. È ansible definire i compiti nella fase di progettazione del process di sviluppo in base ai requisiti.

    Il grande vantaggio di un fragment attività è che il codice utilizzato per il frammento può essere utilizzato per svariate attività.sì, fornisce la riutilizzabilità del codice nello sviluppo delle applicazioni.

    Utilizzo di frammenti per una migliore esperienza utente. Ad esempio, se si dispone di un button e si desidera eseguire, diciamo un servizio web quando si fa clic su di esso, allego un frammento all'attività principale.

     if (id == R.id.forecast) { ForecastFragment forecastFragment = new ForecastFragment(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.main_content, forecastFragment); ft.addToBackStack("backstack"); forecastFragment.setArguments(b); ft.commit(); } 

    In questo modo l'utente non dovrà muovere in un'altra attività.

    E in secondo luogo preferisco frammenti perché è ansible gestire facilmente durante la rotazione.

    Dipende quello che vuoi build veramente. Ad esempio il navigation drawer utilizza frammenti. Le tabs utilizzano anche fragments . Un'altra buona implementazione, è where hai una listview . Quando ruoti il ​​telefono e fai clic su una row, l'attività viene visualizzata nella rimanente metà dello schermo. Personalmente, uso fragments e fragment dialogs , in quanto è più professionale. Inoltre vengono gestite più facilmente in rotazione.

    utilizzare un'attività per each applicazione per fornire una base per fragment uso del fragment per lo schermo, i fragments sono di peso ridotto rispetto ai frammenti di activites sono frammenti riutilizzabili sono più adatti per app che supportno sia telefono che tablet

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.