Używam następującej metody, aby przełączać się między fragmentami (w moim NavigationDrawer), pokazując / ukrywając je.
protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
if ( lastTag != null && !lastTag.equals("")) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}
if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( container, fragment, tag );
}
if ( addToBackStack ) {
transaction.addToBackStack( tag );
}
transaction.commit();
// set the active tag
activeFragTag = tag;
}
Nie mam pewności, która metoda cyklu życia fragmentów jest wywoływana, gdy ją pokazuję lub ukrywam? (ponieważ nie ma metody takiej jak onShow () lub onHide (), nie jestem do końca pewien, której użyć). Chcę wykonać określone czynności po wyświetleniu i ukryciu określonego Fragmentu.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
źródło
źródło
onCreate()
, po którymonCreateDialog()
następuje, a następnieonCreateView()
Odpowiedzi:
Podobnie jak w przypadku cyklu życia działania, Android wywołuje metodę onStart (), gdy fragment staje się widoczny.
onStop()
jest zwykle wywoływana, gdy fragment staje się niewidoczny, ale można ją również wywołać później.W zależności od układu Android może wywoływać
onStart()
nawet wtedy, gdy Twój fragment nie jest jeszcze widoczny, ale należy do widocznego kontenera nadrzędnego. Na przykład jest to ważne, w przypadkuandroid.support.v4.view.ViewPager
którego wymaga się zastąpieniaFragment.setUserVisibleHint()
metody. W każdym razie, jeśli chcesz zarejestrować / wyrejestrować BroadcastReceivers lub innych słuchaczy, możesz bezpiecznie używać metodonStart()
ionStop()
, ponieważ będą one wywoływane zawsze.Uwaga: Niektóre pojemniki na fragmenty mogą uruchamiać niewidoczne fragmenty. Aby poradzić sobie z tą sytuacją, możesz zmienić
Fragment.onHiddenChanged(boolean hidden)
. Zgodnie z dokumentacją fragment musi być zarówno uruchomiony, jak i widoczny (nie ukryty) , aby był widoczny dla użytkownika.Aktualizacja: Jeśli używasz,
android.support.v4.widget.DrawerLayout
fragment poniżej szuflady pozostaje uruchomiony i widoczny, nawet gdy szuflada jest otwarta. W takim przypadku musisz używaćDrawerLayout.setDrawerListener()
i nasłuchiwaćonDrawerClosed()
orazonDrawerOpened()
wywołań zwrotnych.źródło
onStop
ionPause
nie są wywoływane, gdy fragment staje się niewidoczny przy użyciu transakcji. Niemniej jednakonHiddenChanged
jest nazywany, jak sugeruje odpowiedź s1riusNadpisuję tę metodę i rozwiązuję problem:
źródło
setUserVisibleHint
tak, jak pokazano na stackoverflow.com/a/18375436/1815624oczywiście możesz @Override następującą metodę, aby to zrobić:
źródło
getUserVisibleHint()
Fragment w widoku Zachowanie pagera jest inne w przypadku zwykłego kontenera fragmentów.
Wypróbuj ten kod:
źródło
Wypróbuj ten kod:
źródło
Możesz użyć „onCreateView” (lub „onActivityCreated”) i „onHiddenChanged”. Użyj „onCreateView” do pierwszego pokazu, a „onHiddenChanged” na później. „setMenuVisibility” nie jest wywoływana podczas kontroli transakcji.
źródło
Po prostu spróbuj tego w swoim setUserVisibleHint ()
I utwórz ten kod w onCreateView () :
źródło
isVisibleToUser && getView() != null
działało idealnie dla mnie!// przede wszystkim tworzysz interfejs
// Następnie ten interfejs implementuje wewnątrz Fragment w ten sposób
// Teraz idzie Twoja aktywność, a następnie utwórz obiekt interfejsu i wywołaj wewnątrz, gdy addOnViewpagerListener
źródło
setUserVisibleHint
zadzwoń wcześniejonCreateView
. i nie możesz zaktualizować żadnego widoku wewnątrz setUserVisibleHint, którego używamfor visibility, a onHiddenChanged () nie wywołał po raz pierwszy . wywołuje, gdy zmienia się stan ukryty. ponieważ
fragment is visible by default
. Aby uzyskać tę metodę po raz pierwszy, musisz zadzwonić,mFragmentTransaction.hide(oldFragment)
wtedy zadziałaUwaga
jeśli chcesz użyć wskazówki setUserVisible i zaktualizować Widok Użyj tej metody
źródło
Oczywiście można zastąpić
setUserVisibleHint
albosetMenuVisibility
ale jeśli trzeba dostępContext
lubActivity
, będą tam zerowa! Jest inna metodaonStart
która zawsze ma pod ręką kontekst, ale zostanie wywołana tylko raz po utworzeniu fragmentu i jeśli zaczniesz poruszać się między swoimi fragmentami na pagerze, zobaczysz, że nie zostanie wywołana w drugim widoku i później .Więc ... co teraz zrobić?
Obejście jest dość łatwe, użyj
onStart
przy pierwszej wizycie isetMenuVisibility
przy późniejszych. Twój kod prawdopodobnie będzie wyglądał jak poniżej:Klasa fragmentu:
W ten sposób
Context
zawsze będzie dostępnadoSth()
metoda.źródło
Tylko to zadziałało dla mnie !! i
setUserVisibleHint(...)
jest teraz przestarzały (na końcu dołączyłem dokumenty), co oznacza, że niektóre inne odpowiedzi są przestarzałe ;-)Przetestowany i działa
NaviagationDrawer
również z,isMenuVisible()
zawsze wrócitrue
(ionResume()
wydaje się wystarczający, ale chcemyViewPager
też wspierać ).źródło