2013-03-23 21 views
19

Quando si utilizza FragmentActivity ripristina automaticamente lo stato dei frammenti e ricrea tutti i frammenti.Funzionamento del ripristino automatico dei frammenti

So che questo viene fatto principalmente salvando lo stato in onSaveInstanceState e quindi ripristinato in attività onCreate. Guardando un po 'sul codice ho visto che tutti i frammenti vengono ricreati (o allegati solo se retainInstance è true) e aggiunti allo FragmentManager ma non mi è chiaro in che modo vengono aggiunti alla vista, perché la vista non è ripristinato automaticamente.

I miei problemi iniziali erano di ottenere duplicati di alcuni frammenti simili a that other question. ho workarrounded che in onCreate con:

Fragment f = fm.findFragmentByTag(tagName); 
    if(f==null) { 
     f = createFragment(); 
     fm.beginTransaction().add(R.id.myContainer,f,tagName).commit(); 
    } else { 
    //Nothing it's on the view 
    } 

Ora funziona, ma continua a non capire completamente come funziona.

I miei dubbi sono:

  • In quale momento e in che modo sono frammenti attaccati al View? Ho sperimentato che il restauro dei frammenti viene eseguito in onCreate di FragmentActivity. Ma se chiamo setContentView dopo, come il frammento si collega alla vista?
  • È possibile impedire la ricreazione dei frammenti senza sovrascrivere onSaveInstanceState? Perché a causa di diversi layout di orientamento con diverso numero di frammenti la mia intenzione originale era quella di ricreare solo un frammento di stato contrassegnato come conservato e non ripristinare gli altri frammenti di vista che non sono contrassegnati come conservati.

risposta

7

Visualizza la gerarchia non ripristinata automaticamente. Quindi, in Fragment.onCreateView() o Activity.onCreate(), è necessario ripristinare tutte le viste (da xml o programmaticamente). Ogni ViewGroup che contiene un frammento deve avere lo stesso ID di quando lo hai creato la prima volta. Una volta creata la gerarchia della vista, Android ripristina tutti i frammenti e inserisce le loro viste nella parte destra dello standard ViewGroup grazie all'ID. Supponiamo che Android ricordi l'ID dello ViewGroup su cui si trovava un frammento. Questo succede da qualche parte tra onCreateView() e onStart().

Penso che sia possibile mantenere la ricreazione dei frammenti ma, nel ViewGroup che contiene il frammento, impostare la visibilità su GONE. In questo modo, il frammento non viene visualizzato ed è possibile rimuoverlo in seguito in modo programmatico.

Problemi correlati