Qual è il vantaggio di utilizzare Fragments in Android, piuttosto che Views?


102

Durante lo sviluppo per Android, puoi impostare il tuo SDK target (o minimo) su 4 (API 1.6) e aggiungere il pacchetto di compatibilità Android (v4) per aggiungere il supporto Fragments. Ieri l'ho fatto e l'ho implementato con successo Fragmentsper visualizzare i dati da una classe personalizzata.

La mia domanda è questa: qual è il vantaggio dell'utilizzo Fragmentsrispetto a ottenere semplicemente una vista da un oggetto personalizzato e continuare a supportare l'API 1.5?

Ad esempio, diciamo che ho la classe Foo.java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Entrambi i metodi sono molto semplici da creare e con cui lavorare in un'attività che, diciamo, ha un List<Foo>da visualizzare (ad esempio, aggiungendo programmaticamente ciascuno a a ScrollView), quindi sono Fragmentsdavvero tutti utili, o sono solo una semplificazione eccessivamente glorificata di ottenere una vista, ad esempio attraverso il codice sopra?


2
I frammenti non devono avere un'interfaccia utente, possono semplicemente essere un comportamento riutilizzabile. In tal caso, una vista sarebbe ridondante.
Philipp Reichart

Ho risposto a questa domanda in un'altra domanda. Vedi stackoverflow.com/a/14912608/909956 T; dr: a volte i frammenti ti consentono di creare più componenti riutilizzabili rispetto a fare affidamento sull'implementazione della visualizzazione personalizzata. vedere il collegamento per il motivo.
numan salati

Risposte:


172

Il motivo principale per utilizzare Fragments è per le funzionalità backstack e lifecycle. In caso contrario, le visualizzazioni personalizzate sono più leggere e più semplici da implementare.

All'inizio, ho effettivamente provato a creare un'app per telefono / tablet utilizzando visualizzazioni personalizzate. Tutto sembrava funzionare su telefoni E tablet, anche passando dal pannello singolo al pannello diviso. Dove mi sono imbattuto nei problemi è stato con il pulsante Indietro e il ciclo di vita. Dato che stavo semplicemente aggiornando le visualizzazioni manualmente ... non c'era nulla che tenesse traccia della cronologia delle visualizzazioni e dei loro stati. Pertanto, il pulsante Indietro non ha funzionato come previsto ed è stato difficile ricreare anche lo stato più recente durante gli eventi del ciclo di vita, ad esempio durante la rotazione dell'app. Per risolvere questo problema, ho dovuto racchiudere le mie visualizzazioni personalizzate in frammenti e utilizzare FragmentManager in modo che gli stati precedenti venissero salvati e ricreati.

Mi sono reso conto dopo aver risposto di aver pubblicato una domanda simile un anno prima: https://stackoverflow.com/a/11126397/618881


14
Risposta molto buona. Volevo solo aggiungere che i frammenti possono essere annidati dalla 4.2 o supportare la libreria rev 11.
kar

2
Grazie @Karlo per l'aggiornamento. Non pensavo fosse concettualmente possibile, ma ci hanno aggirato usando un FragmentManager privato tramite getChildFragmentManager (). Oh, ed è API 17, non 11, e disponibile tramite la libreria di supporto.
Henry

2
Stavo solo guardando di nuovo questa domanda, e anche la mia esperienza è cambiata. Questa è una risposta che fornisce una buona comprensione sia dei vantaggi che degli svantaggi ed è molto utile. Grazie!
Phil

2
Vuoi fare +1 su questa risposta, ma farlo rovinerebbe il punteggio attuale. Inoltre, 70 non è il mio numero preferito.
Behnam

1
per l'anno scorso, stavo anche pensando che i frammenti non fornissero alcuna funzionalità extra ordinaria, ma ho riscontrato che dopo aver fatto nuovamente clic sull'attività stavo perdendo tutte le immagini scaricate, quindi ho dovuto aggiungere l'implementazione della cache, ora sto pensando di usare frammenti potrebbe essere molto facile
Shirish Herwade

27

Direi che i frammenti sono utili in due scenari: se dividi le visualizzazioni su alcuni dispositivi / orientamenti e le mostri in due attività e mostri tutto il contenuto in una su altri dispositivi. Sarebbe un caso d'uso se vai su un tablet o forse anche in modalità orizzontale su un telefono: ad esempio, mostri l'elenco di elementi e i dettagli su una schermata. su un telefono o in modalità verticale si mostra solo una parte.

Un altro caso d'uso sono le visualizzazioni riutilizzabili. Quindi, se hai alcune visualizzazioni che sono visibili su diverse attività ed esegui anche alcune azioni, potresti mettere questo comportamento in un frammento e poi riutilizzarlo. Ovviamente potresti farlo anche con widget personalizzati.

Non vedrei alcun motivo per utilizzare Fragments per ogni vista e immagino che sarebbe solo un sovraccarico. Li sto usando solo nel primo caso d'uso e direi che qui è una semplificazione.


Grazie, è stato decisamente utile. Penso che mi atterrò alle visualizzazioni e creerò il mio "back stack" per renderle riutilizzabili.
Phil

3

Android ha introdotto frammenti in Android 3.0 (livello API 11), principalmente per supportare progetti di interfaccia utente più dinamici e flessibili su schermi di grandi dimensioni, come i tablet. Poiché lo schermo di un tablet è molto più grande di quello di un telefono, c'è più spazio per combinare e scambiare i componenti dell'interfaccia utente. I frammenti consentono tali progetti senza la necessità di gestire modifiche complesse alla gerarchia di visualizzazione. Dividendo il layout di un'attività in frammenti, si diventa in grado di modificare l'aspetto dell'attività in fase di runtime e di preservare le modifiche in un back stack gestito dall'attività.

Qui puoi leggere di più.


Ho letto tutta la documentazione, tuttavia stavo cercando qualcosa che spiegasse meglio i loro vantaggi, come i tablet o il backstack
Phil

3
  1. Schermo diviso attività scenario - Abbiamo un layout e un'attività che gestisce la parte sinistra destra dello schermo
  2. Scenario FragmentActivity abbiamo un layout per la schermata principale, uno per la sinistra e uno per la destra

Lo scenario uno è buono se hai un'applicazione semplice.

Lo scenario due è utile se vuoi avere più frammenti e più FragmentActivities e puoi combinare ciascuno di questi. Inoltre puoi creare interazioni tra i frammenti.

Ho Fragmentactivity a schermo diviso posso chiamarlo con 'Intent Extras' e dire a fragmentActivity quale frammento deve essere caricato. I frammenti sono buoni perché non sono in manifest, quindi potresti creare frammenti riutilizzabili e FragmentActvity.

Ma rende il tuo progetto più grande. Ma se fai grandi progetti puoi salvarne molti. Perché puoi usare gli stessi frammenti o la stessa attività dei frammenti.

E penso che questi frammenti arrivino un po 'tardi, quindi devi provare a pensare in modo nuovo. Forse prova a convertire la tua attività in FragmentActivity. Successivamente prova a trovare il codice riutilizzabile e crea un frammento da esso.

È utile ma non so come adesso. Ma ho alcune idee.

Questo è sempre un problema. Il team di Android ha fatto qualcosa e nessuno sa a cosa serve. Perché difficilmente impariamo com'era e qui arrivano alcune cose nuove.

Secondo me è buono ma non per il motivo che Google ci dice.


0

Aggiungi un caso quando usi Fragment o Activity su CustomView:

Quando si utilizza CursorLoader per osservare determinate viste, ListView o TextView e si desidera aggiornare il loro valore visualizzato ogni volta che i dati di ContentProvider si aggiornano al back-end (caso più comune si dispone di un servizio che aggiorna il database locale eseguendo periodicamente il polling dei dati dal database / cloud remoto )


-2

Una cosa importante che tutti i commenti sopra non menzionano è che un frammento rimane residente in memoria anche se Android interrompe l'attività e la riavvia quando fai qualcosa come cambiare l'orientamento del tuo dispositivo. Questo viene fatto per motivi di prestazioni, ma può anche portare a risultati imprevisti se ti aspettavi che i frammenti venissero distrutti solo per scoprire che vengono ricreati dal nulla.

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.