ViewPager z zagnieżdżonymi fragmentami?

Mój problem

Zgodnie z dokumentami Google:

Możesz teraz osadzać fragmenty wewnątrz fragmentów. Jest to przydatne w różnych sytuacjach, w których chcesz umieścić dynamiczne i wielokrotnego użytku komponenty interfejsu użytkownika w składniku interfejsu użytkownika, który sam jest dynamiczny i nadaje się do ponownego użycia. Na przykład,jeśli używasz ViewPager do tworzenia fragmentów przesuń palcem w lewo iw prawo i zużyj większość miejsca na ekranie można teraz wstawiać fragmenty do każdej strony fragmentu. Aby zagnieździć fragment, po prostu wywołaj getChildFragmentManager () na fragmencie, w którym chcesz dodać fragment. Zwraca to FragmentManager, którego możesz użyć, jak zwykle, z aktywności najwyższego poziomu, aby utworzyć transakcje fragmentacji. Na przykład, oto kod, który dodaje fragment z istniejącej klasy Fragment:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Więc stworzyłem własnąPageFragment. I mójPageFragmentAdapterskłada się z 3 stronPageFragment. Mam też sześć fragmentów:Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC. W moimMainActivity Inicjalizuję moje sześć fragmentów, mójViewPager i jegoPageFragmentAdapter (które inicjują trzyPageFragment dla siebie).

Następnie używam tej metody do dołączenia mojejFragment1, Fragment2, Fragment3 do każdej strony (do każdejPageFragment) zPageFragmentAdapter:

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

Mogę otrzymać (za pomocą metod wPageFragmentAdapter) Fragmenty i przekształcenie „zagnieżdżonego fragmentu” w mójPageFragment (oczywiście wonCreate()) lubić:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

Uwaga: używamPageFragment.setNestedFragment() ustawićmFragment w tym.

I działa świetnie! Pomoże mi (ale ta historia nie dotyczy tego), aby po prostu zastąpić fragmenty w ViewPager, takie jak:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Ale mam jeden ogromny problem. Ponownie dokumenty Google:

Implementacja PagerAdapter, który reprezentuje każdą stronę jako Fragment, który jest stale przechowywany w menadżerze fragmentów, o ile użytkownik może powrócić do strony. Ta wersja pagera jest najlepsza do użycia, gdy istnieje kilka zazwyczaj bardziej statycznych fragmentów, które mają być stronicowane, na przykład zestaw zakładek.Fragment każdej strony użytkownika odwiedziny będą przechowywane w pamięci, choć może to być hierarchia widoku zniszczone, gdy nie są widoczne. Może to spowodować użycie znacznej ilości pamięci, ponieważ instancje fragmentów mogą utrzymywać dowolną ilość stanu.

Jak widziszPageFragmentAdapter może zniszczyć każdą mojąPageFragment i oczywiście jego zagnieżdżony fragment. Gdy zostanie ponownie utworzony, zamiast tego będzie miał wartość NULLmFragment wartość. Próbuję to zapisaćgetChildFragmentManager().putFragment() a potem zdobądź togetChildFragmentManager().getFragment(). Ale to nie działa.

Pytanie

Więc moje pytanie brzmi:Jak zapisać zagnieżdżony fragment w moim fragmencie macierzystym? Czy to możliwe?

Byłbym bardzo wdzięczny za twoją pomoc. Alex. P.S. Naprawdę przepraszam za mój angielski :)

EDYTOWAĆ

Thx @ AndroidBegin.com dla odpowiedzi!

Wydaje się, że jest to błąd w nowo dodanej obsłudze zagnieżdżonych fragmentów. Zasadniczo potomny FragmentManager kończy się zerwanym stanem wewnętrznym, gdy zostanie odłączony od działania. Krótkoterminowe obejście, które naprawiło to dla mnie, to dodanie do onDetach () każdego fragmentu, który wywołujesz getChildFragmentManager () na:

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion