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 wybranychFragments 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świetleniaFragments przez aFragmentPagerAdapteri upewnij się, że zawarteFragments 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 zFragments, 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 teFragmentMetody 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ąćViewPagerjestFragments, gdyViewPager być może jest oderwany od rodzica? Innymi słowy, kiedy wiem, żeViewGroup nie jest już używany, chciałbym wystąpićFragmentTransactiongdzieś (być może wFragmentPagerAdapter), aby je usunąćFragments.

Alternatywnie, zdaję sobie sprawę, że mogę po prostu zachowaćViewPager po prawej na stałe i dynamicznie zamieniajFragments 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.

questionAnswers(1)

yourAnswerToTheQuestion