2012-01-25 14 views
9

Ho un attività con un ViewFlipper che gira tra un gruppo di views (pagine) con i miei dati.ViewFlipper vs Frammenti

Sto considerando di utilizzare l'API dei frammenti per passare da una vista all'altra. Quali sono i vantaggi di farlo?

Potrei vedere un aumento delle prestazioni utilizzando i frammenti poiché ViewFlipper agisce essenzialmente sui flag di visibilità e i frammenti in realtà sostituiscono la gerarchia delle viste quando li aggiungi/rimuovi?

Qualcuno può darci un quadro più chiaro su questo?

Grazie!

+2

Se si desidera un'analisi delle prestazioni, è necessario farlo da soli. Lo stack non è generalmente adatto a rispondere a questo tipo di domande. – Warpzit

risposta

14

Un Frammento rappresenta un comportamento o una porzione di interfaccia utente in un'attività. È possibile combinare più frammenti in un'unica attività per creare un'interfaccia utente a più riquadri e riutilizzare un frammento in più attività. Puoi pensare a un frammento come a una sezione modulare di un'attività, che ha il suo ciclo di vita, riceve i propri eventi di input e che puoi aggiungere o rimuovere mentre l'attività è in esecuzione (una specie di "attività secondaria" che puoi riutilizzo in diverse attività).

Un frammento deve sempre essere incorporato in un'attività e il ciclo di vita del frammento è direttamente influenzato dal ciclo di vita dell'attività dell'host. Ad esempio, quando l'attività è in pausa, lo sono anche tutti i frammenti e quando l'attività viene distrutta, lo sono anche tutti i frammenti. Tuttavia, mentre un'attività è in esecuzione (è nello stato del ciclo di vita ripristinato), è possibile manipolare ciascun frammento in modo indipendente, ad esempio aggiungendolo o rimuovendolo. Quando si esegue tale operazione frammento, è anche possibile aggiungerlo a una pila di nuovo che è gestito dalla attività di ogni voce-stack di nuovo in attività è un record della transazione frammento che si è verificato. Lo stack posteriore consente all'utente di invertire una transazione di frammento (navigare all'indietro), premendo il pulsante INDIETRO.

Ma ViewFlipper lavora in una singola attività. ViewAnimator semplice che animerà tra due o più punti di vista che sono stati aggiunti ad esso. Viene mostrato un solo bambino alla volta.Se richiesto, può automaticamente capovolgere tra ogni bambino a intervalli regolari.

3

MODIFICA: Sto parlando di ViewPager qui, non di ViewFlipper.

Il vantaggio di utilizzare ViewPager è che è molto semplice da utilizzare. Devi semplicemente creare un FragmentPagerAdapter e compilare un paio di campi semplici. Di seguito è riportato un esempio che ho scritto per visualizzare gli elementi che vengono passati dalla classe padre.

public static class DashboardPagerAdapter extends FragmentPagerAdapter { 

    private static final int NUM_ITEMS_PER_SCREEN = 12; 

    private List<View> mAllItems; 
    private int mNumScreens; 

    public DashboardPagerAdapter(FragmentManager fm, List<View> allItems) { 
     super(fm); 
     mAllItems = allItems; 
     mNumScreens = (int) Math.ceil(mAllItems.size() 
       /(float) NUM_ITEMS_PER_SCREEN); 
     Log.d(TAG, "num screens: " + mNumScreens); 
    } 

    @Override 
    public int getCount() { 
     return mNumScreens; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     DashboardScreenFragment screen = DashboardScreenFragment 
       .newInstance(); 

     for (int i = position * NUM_ITEMS_PER_SCREEN; i < (position + 1) 
       * NUM_ITEMS_PER_SCREEN; i++) { 
      if (i >= mAllItems.size()) { 
       break; 
      } 
      screen.addChild(mAllItems.get(i)); 
     } 
     return screen; 
    } 
} 

E la sua creazione è super semplice:

final DashboardPagerAdapter adapter = new DashboardPagerAdapter(
      getFragmentManager(), mAllButtons); 

Contrariamente a quanto @ sebap123 Detto questo, è possibile utilizzare frammenti con android v4 e soprattutto con la libreria di supporto; vedi http://developer.android.com/sdk/compatibility-library.html per i dettagli, ma in realtà si tratta solo di mettere il file jar nella directory/libs.

BTW, si noti che con ViewPager, ogni "pagina" è a sua volta un frammento.

Per quanto riguarda l'eventuale miglioramento delle prestazioni, dipende da cosa si sta confrontando. Consiglio vivamente di provare ViewPager e solo dopo essermi preoccupato dei problemi di prestazioni. Come diceva Donald Knuth, "dovremmo dimenticare le piccole efficienze, diciamo circa il 97% delle volte: l'ottimizzazione prematura è la radice di tutto il male".

In ogni caso, se si dispone di un numero elevato di pagine, vedere http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html per un adattatore più appropriato.

+1

Sto parlando dell'utilizzo di un ViewFlipper per capovolgere tra i frammenti. Mi riferisco al confronto tra l'uso di FragmentManager per aggiungere/rimuovere i frammenti rispetto all'utilizzo di un ViewFlipper che capovolge solo le viste (non ancora frammenti!) – dnkoutso

+0

La differenza è nelle immagini. Se vuoi che l'utente sia in grado di scorrere orizzontalmente tra le schermate, dovresti usare ViewFlipper. Se si desidera semplicemente aggiungere e rimuovere i frammenti (ad esempio con i pulsanti), è necessario utilizzare FragmentManager. –

+1

Wow, sai cosa ho appena realizzato? Ho parlato di ViewPager per tutto questo tempo, non di ViewFlipper. ViewFlipper è completamente diverso, mi dispiace. Piuttosto che cancellare l'intera cosa, ho intenzione di modificare e sostituire "ViewFlipper" con ViewPager, anche se non risponde direttamente alla domanda. –

Problemi correlati