Pytanie Uzyskiwanie odniesienia do potomka Fragment za rodzicem Fragment został odtworzony


Od wersji Android 4.2 obsługuje Androida zagnieżdżone Fragmenty. Dokument nie zawiera wielu wyjaśnień dotyczących zagnieżdżonych Fragment cykle życia, ale z doświadczenia wynika, że ​​ich cykl życiowy jest bardzo podobny do "zwykłego" Fragments.

Wygląda jednak na jedną wielką różnicę: dziecko Fragments nie są przywracane, gdy rodzic Fragment  onCreate metoda jest wywoływana. W konsekwencji wydaje się niemożliwe zapisanie / przywrócenie odniesienia do konkretu Fragment:

  • Za pomocą getChildFragmentManager.findFragmentByTag(String) zawsze wraca null w rodzicu Fragment  onCreate(Bundle) bo mActive jest null.
  • Za pomocą putFragment/getFragment wyniki w NullPointerException bo getFragment szuka rozmiaru wartości zerowej mActive  ArrayList.

Moje pytanie jest bardzo proste. Czy istnieje poprawny sposób na uzyskanie odniesienia do dziecka Fragment w rodzica Fragment  onCreate metoda?


21
2017-10-01 09:30


pochodzenie


Robi getChildFragmentManager().getFragments() mieć odniesienie do fragmentu potomnego? - Rahul Parsani
Pracowałem tylko z obsługą fragmentacji zagnieżdżonych fragmentów, ale mogę powiedzieć, że zagnieżdżone fragmenty są tam odtwarzane, a dla dynamicznych sytuacji podążasz za zwykłym "sprawdzenie czy zaznaczony fragment jest w podrzędnym menedżerze fragmentów, w przeciwnym razie utwórz nowy fragment" . To działało całkiem dobrze, gdy na przykład użyłem fragmentów potomnych jako "robotnicy". - Thomas Keller


Odpowiedzi:


Nie sądzę, że możesz wejść onCreate ponieważ widok nie jest zbudowany w tym czasie. Możesz wejść onViewCreated() chociaż. Logika, której użyłem to:

  • Sprawdź, czy jest zapisany stan onViewCreated()jeśli tak, spróbuj zdobyć fragment dziecka
  • Następnie sprawdź, czy fragment podrzędny ma wartość null, jeśli jest, dodaj go za pomocą menedżera fragmentów potomnych.

Przez "sprawdzanie" rozumiem szukanie fragmentu przez id. Domyślam się, że tag też powinien działać.

AFAIK nie możesz uzyskać fragmentu dziecka przed hierarchia widoku zostanie przywrócona lub utworzona, ale możesz zrobić to samo w późniejszym czasie, na przykład w onActivityCreated()


26
2017-10-01 09:50



Zgadzam się z tą odpowiedzią. Dla bezgłowego fragmentu używam onActivityCreated hak, aby uzyskać dostęp do fragmentów potomnych. - jayeffkay


A co z setRetainInstanceState (true) na twoim fragmencie? Czy to rozwiąże twój problem? Rozwiązał on pewne problemy, gdy mam Fragmenty Dziecka. Muszę tylko zachować odniesienie do elementu potomnego w tym fragmencie.

Ale zawsze robiłem to w onCreateView (). Nie wiem, czy będzie działać on onCreate ()

Czy masz na myśli coś zupełnie innego?


1
2017-10-01 21:27





używasz FragmentPagerAdapter? jeśli nie, wypróbuj FragmentPagerAdapter zamiast FragmentStatePagerAdapter Zauważyłem, że mam pewne błędy podczas korzystania z FragmentStatePagerAdapter, gdy mam 4 poziom zagnieżdżenia. Niestety, mój angielski jest słaby.

@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);
}

1
2018-01-28 19:52