2013-10-01 12 views
20

Avvio di Android 4.2, Android supporta nested Fragments. Il documento non fornisce molte spiegazioni sui cicli di vita nidificati Fragment ma, a causa dell'esperienza, sembra che il loro ciclo di vita sia molto simile a "regolare" Fragments.Ottenere un riferimento a un figlio Frammento dopo il genitore Frammento è stato ricreato

Sembra che ci sia una sola grande differenza: il bambino Fragments non viene ripristinato quando viene chiamato il metodo genitore FragmentonCreate. Di conseguenza, sembra impossibile per salvare/ripristinare un riferimento ad un particolare Fragment:

  • Utilizzando getChildFragmentManager.findFragmentByTag(String) restituisce sempre null nel genitore FragmentonCreate(Bundle) perché mActive è null.
  • Utilizzando putFragment/getFragment risultati in un NullPointerException perché getFragment guarda per la dimensione di un nulla mActiveArrayList.

Quindi, la mia domanda è abbastanza semplice. Esiste un modo corretto per recuperare un riferimento a un figlio Fragment nel metodo genitore FragmentonCreate?

+0

Does getChildFragmentManager(). GetFragments() 'ha un riferimento al frammento figlio? –

+1

Ho solo lavorato con l'implementazione della liberia di supporto dei frammenti nidificati, ma quello che posso dire è che qui vengono ricreati frammenti nidificati e per le situazioni dinamiche si segue il solito "controlla se il frammento taggato è nel gestore frammenti figlio altrimenti crea nuovamente il frammento" ciclo. Questo ha funzionato abbastanza bene per me quando ho usato i frammenti figlio come "lavoratori" per esempio. –

risposta

25

Non penso che sia possibile in onCreate come la vista non è costruita in quel momento. È possibile in onViewCreated() però. La logica che ho usato è:

  • verificare se c'è stato salvato in onViewCreated(), se c'è, cercare di ottenere il frammento bambino
  • Quindi verificare se il frammento bambino è nullo, se lo è, aggiungerlo usando il gestore del frammento figlio.

Per "controllo" intendo la ricerca del frammento con id. Immagino per tag dovrebbe funzionare anche.

per quanto ne so non è possibile ottenere un frammento bambino prima la gerarchia della vista viene ripristinata o creato, ma si potrebbe fare lo stesso in un secondo momento, per esempio in onActivityCreated()

+0

Sono d'accordo con questa risposta. Per un frammento senza testa, utilizzo l'hook 'onActivityCreated' per accedere ai frammenti child. – jayeffkay

1

Che dire setRetainInstanceState (vero) sul tuo frammento? Potrebbe risolvere il tuo problema? Ha risolto alcuni problemi quando ho ChildFragments in a Fragment. Devo solo mantenere un riferimento alla childfragment nel frammento.

Ma l'ho sempre fatto su onCreateView(). Non sono sicuro se funzionerà su onCreate()

O intendi qualcosa di completamente diverso?

0

stai usando FragmentPagerAdapter? se non provi FragmentPagerAdapter invece di FragmentStatePagerAdapter Mi sono reso conto che ho qualche problema con FragmentStatePagerAdapter quando ho 4 livelli di nesting. Scusa il mio inglese è povero.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
    mFragment1 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment1); 
    mFragment2 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment2); 
    mFragment3 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment3); 
    } else { 
    mFragment1 = SomeFragment.newInstance("param1"); 
    mFragment2 = SomeFragment.newInstance("param2"); 
    mFragment3 = SomeFragment.newInstance("param3"); 
    } 
    super.onCreate(savedInstanceState); 
    mMyPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), mFragment1, mFragment2, mFragment3); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if (mFragment1 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment1, 
       mFragment1); 
    } 

    if (mFragment2 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment2, 
       mFragment2); 
    } 

    if (mFragment3 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment3, 
       mFragment3); 
    } 

    super.onSaveInstanceState(outState); 
} 
Problemi correlati