Programowe usuwanie ViewPager, kiedy są (lub jak mogę zapewnić) zawarte Fragmenty są niszczone?
Szukając wcześniej tego problemu, mogę znaleźć wiele dyskusji dotyczących dynamicznego dodawania i usuwania wybranychFragment
s od aViewPager
. Tym, o co mnie tak naprawdę martwi, jest to, jak mogę programowo usunąć całyViewPager
„czysto” od jego zawartościViewGroup
, kiedy toViewPager
został użyty do wyświetleniaFragment
s przez aFragmentPagerAdapter
i upewnij się, że zawarteFragment
s są prawidłowo niszczone.
Aby jeszcze bardziej rozwinąć to pytanie, mam dwuwarstwowy układ krajobrazowy, w którym wybór jest dokonywany z listy w obrębieFragment
po lewej stronie, a wybrana treść jest następnie umieszczana po prawej stronieFrameLayout
. Kluczową sprawą jest to, że treść może być stronicowana lub nie. Dlatego treść musi być wyświetlana wViewPager
format, lub jeśli nie jest stronicowany, będzie reprezentowany przez pojedynczyFragment
bezpośrednio.
Aby pokazać singielFragment
, Po prostu wykonuję aFragmentTransaction
tak jak normalnie, aby umieścićFragment
wFrameLayout
pojemnik. Jeśli z drugiej strony wyświetlana jest zawartość stronicowana, to zamiast niej tworzęViewPager
i dodaj go jako dzieckoFrameLayout
.
Kiedy muszę zmienić treść, to czy poprzednia treść była samodzielnaFragment
wtedy mogę go po prostu usunąćFragmentTransaction
.remove()
. Kiedy to zrobię,Fragment
przechodzi przezonPause()
...onDestroy()
cykl zgodnie z oczekiwaniami. Jeśli poprzednia treść byłaViewPager
potem usuwam go zFrameLayout
za pomocą.removeAllViews()
. Tutaj dochodzę do problemu: nie widzę żadnego z nichonPause()
...onDestroy()
metody wywoływane w dowolnym zFragment
s, które odbywały się w tymViewPager
za pośrednictwemFragmentPagerAdapter
.
Z punktu widzenia użytkownika aplikacja działa dobrze. Po kilku rundachViewPager
po usunięciu widzę pamięć GC odzyskującą pamięć. Nie podoba mi się jednak to, że teFragment
Metody końca życia nie są wywoływane, ponieważ nie mogę wykonać w nich żadnego czyszczenia, a to po prostu nie wydaje się „właściwe”.
Czy istnieje metoda, którą mogę podłączyć, aby usunąćViewPager
jestFragment
s, gdyViewPager
być może jest oderwany od rodzica? Innymi słowy, kiedy wiem, żeViewGroup
nie jest już używany, chciałbym wystąpićFragmentTransaction
gdzieś (być może wFragmentPagerAdapter
), aby je usunąćFragment
s.
Alternatywnie, zdaję sobie sprawę, że mogę po prostu zachowaćViewPager
po prawej na stałe i dynamicznie zamieniajFragment
s w tym. Oczywiście to po prostu nie miałoby znaczenia, że w pewnych momentach miałaby tylko jedną stronę. Jeśli byłby to lepszy sposób, to powinienem zmienić kod, aby to zrobić, ale doceniłbym opinie.