FragmentPagerAdapter вътре във фрагмента

Имам малко проблеми с внедряването на дизайн, базиран на множество ViewPagers.

На високо ниво имам FragmentActivity само с FrameLayout като съдържание. Имам 3 различни фрагмента, които искам да покажа. Всичките 3 са на цял екран и само 1 ще се използва наведнъж.

Фрагмент 1 е основен фрагмент с някои TextViews и ImageViews. Фрагмент 2 има ViewPager и FragmentPagerAdapter, които му подават няколко прости фрагмента. Фрагмент 3 има ViewPager и FragmentPagerAdapter, които го захранват с няколко прости фрагмента (които са различни от Фрагмент 2)

В моята FragmentActivity onCreate() получавам FragmentManager и започвам транзакция, за да заменя каквото и да е в моя FrameLayout с нов екземпляр на Fragment 2.

На този етап всичко работи според очакванията. Моят ViewPager във фрагмент 2 работи перфектно.

Сега имам опция от менюто, която замества Fragment 2 в моя FrameLayout с нов екземпляр на Fragment 3. Това също работи добре.

Проблемът възниква, когато се опитам да върна фрагмент 2 обратно във FrameLayout с друга транзакция за замяна. Виждам моя PagerIndicater в горната част, но страниците ми са празни.

Опитах просто да създам нов екземпляр на моя фрагмент 2 и да извикам транзакция за замяна. Също така се опитах да задам маркер на моите фрагменти, когато извикам replace и добавяне на проверка findFragmentByTag преди замяната ми, вместо да създавам нов екземпляр. И двете ми дадоха един и същ резултат от празни страници след втората ми замяна.

За справка Първият ми дизайн беше просто FragmentActivity с ViewPager и ViewIndicater. Имах само Фрагмент 2 и Фрагмент 3 от моето описание по-горе и опция от менюто за превключване между тях. За превключване имах дефинирани 2 различни FragmentPagerAdapters и просто извиках ViewPager.setAdapter, за да задам избрания FragmentPagerAdapter. Това работеше перфектно, но сега имам нужда от нов фрагмент от най-високо ниво, който изобщо не използва ViewPager. Ето защо реших да преместя моите ViewPagers в техните собствени фрагменти. Идеята ми е, че просто ще сменя моите фрагменти на FrameLayout.

В момента нямам моя код пред себе си, така че не мога да публикувам, но ще добавя код към въпроса си утре, за да улесня отговорите.


comment
Имах проблеми с адаптерите, когато използвах фрагменти във фрагменти. Не съм сигурен дали е същият, който имате, но опитайте да поставите извикването си към setAdapter в Runnable. Вижте тук: stackoverflow.com/a/10358889/377260   -  person Paul Burke    schedule 22.08.2012


Отговори (2)


Този въпрос е възможен дубликат на Навигиране обратно към FragmentPagerAdapter -› фрагментите са празни.

Ако приложението ви може да се справи (API 17), използвайте getChildFragmentManager(). Този проблем изглежда възниква при използване на фрагмент за хостване на вашия ViewPager и използване на FragmentPagerAdapter. Промяната на FragmentStatePagerAdapter изглежда също реши проблема, но все още мисля, че използването на getChildFragmentManager() е най-умното нещо, което трябва да направите.

person blinkmacalahan    schedule 26.09.2013
comment
Използването на FragmentStatePagerAdapter вместо FragmentPagerAdapter свърши работа за мен :) - person Patrick Boos; 27.11.2013
comment
Здравейте, аз също използвах FragmentStatePagerAdapter за този проблем. Но тогава забелязах, че фрагментите не се премахват от паметта? Те просто продължават да добавят и това е възможно изтичане на памет. Има ли начин да се заобиколи това? - person John Ernest Guadalupe; 29.11.2015
comment
@JohnErnestGuadalupe Откъде знаеш, че този фрагмент все още е в паметта? - person rupinderjeet; 30.06.2017

броколи можете да използвате не "добър начин". Но при мен проработи.

Можете да използвате в изглед 2 оформления, където свързвате фрагменти. Първо - за фрагмент с фрагменти. Второ - за други фрагменти.

При замяна на фрагмент с фрагменти не заменяйте, а само променете видимостта на първото оформление на изчезнало и добавете нов фрагмент към второто оформление. Отзад премахнете фрагмент от второто оформление и задайте видимост за първото оформление на видимо.

person Yura Shinkarev    schedule 17.12.2012