Ich verwende die folgende Methode, um zwischen Fragmenten (in meinem NavigationDrawer) zu wechseln, indem ich sie ein- / ausblende.
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;
}
Was mir unklar ist, ist, welche Methode des Fragment-Lebenszyklus aufgerufen wird, wenn ich sie ein- oder ausblende? (Da es keine Methode wie onShow () oder onHide () gibt, bin ich mir nicht ganz sicher, was ich verwenden soll). Ich möchte bestimmte Aktionen ausführen, wenn ein bestimmtes Fragment ein- und ausgeblendet wird.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
quelle
quelle
onCreate()
, gefolgt vononCreateDialog()
, gefolgt vononCreateView()
Antworten:
Ähnlich wie im Aktivitätslebenszyklus ruft Android onStart () auf, wenn das Fragment sichtbar wird.
onStop()
wird normalerweise aufgerufen, wenn das Fragment unsichtbar wird, kann aber auch später aufgerufen werden.Abhängig von Ihrem Layout kann Android
onStart()
sogar aufrufen , wenn Ihr Fragment noch nicht sichtbar ist, aber zu einem sichtbaren übergeordneten Container gehört. Dies ist beispielsweise gültig, fürandroid.support.v4.view.ViewPager
die Sie dieFragment.setUserVisibleHint()
Methode überschreiben müssen . Auf jeden Fall, wenn Sie austragen BroadcastReceivers oder andere Zuhörer registrieren / müssen, können Sie sicher nutzenonStart()
undonStop()
Methoden , weil diese immer aufgerufen werden.Hinweis: Einige Fragmentcontainer können unsichtbare Fragmente starten. Um mit dieser Situation umzugehen, können Sie überschreiben
Fragment.onHiddenChanged(boolean hidden)
. Gemäß der Dokumentation muss ein Fragment sowohl gestartet als auch sichtbar (nicht ausgeblendet) sein , um für den Benutzer sichtbar zu sein.Update: Wenn Sie verwenden,
android.support.v4.widget.DrawerLayout
bleibt ein Fragment unter der Schublade gestartet und sichtbar, auch wenn die Schublade geöffnet ist. In diesem Fall müssen Sie den EinsatzDrawerLayout.setDrawerListener()
und hörenonDrawerClosed()
undonDrawerOpened()
Rückrufe.quelle
onStop
undonPause
werden nicht aufgerufen, wenn ein Fragment mithilfe einer Transaktion unsichtbar wird. TrotzdemonHiddenChanged
heißt es wie vorgeschlagen s1rius AntwortIch überschreibe diese Methode und löse mein Problem:
quelle
setUserVisibleHint
wie in stackoverflow.com/a/18375436/1815624 gezeigt funktioniertNatürlich können Sie die folgende Methode verwenden, um dies zu tun:
quelle
getUserVisibleHint()
Das Verhalten des Fragment-in-View-Pagers unterscheidet sich beim regulären Fragment-Container.
Versuchen Sie diesen Code:
quelle
Versuchen Sie diesen Code:
quelle
Sie können 'onCreateView' (oder 'onActivityCreated') und 'onHiddenChanged' verwenden. Verwenden Sie 'onCreateView' für die erste Show und 'onHiddenChanged' für die spätere. 'setMenuVisibility' wird bei der Transaktionssteuerung nicht aufgerufen.
quelle
Versuchen Sie dies einfach in Ihrem setUserVisibleHint ()
Und erstellen Sie diesen Code in onCreateView () :
quelle
isVisibleToUser && getView() != null
hat perfekt für mich funktioniert!// Zunächst erstellen Sie eine Schnittstelle
// Danach wird diese Schnittstelle so in Fragment implementiert
// Jetzt geht deine Aktivität, dann erstelle ich ein Objekt der Schnittstelle und rufe es beim addOnViewpagerListener auf
quelle
setUserVisibleHint
vorher anrufenonCreateView
. und Sie können keine Ansicht in setUserVisibleHint aktualisieren, die ich verwendefür Sichtbarkeit und onHiddenChanged () hat nicht zum ersten Mal aufgerufen . Es wird aufgerufen, wenn sich der verborgene Zustand ändert. weil a
fragment is visible by default
. Um diese Methode zum ersten Mal zu erreichen, müssen Sie sie aufrufen,mFragmentTransaction.hide(oldFragment)
dann funktioniert sieHinweis
Wenn Sie den setUserVisible-Hinweis verwenden und die Ansicht aktualisieren möchten, verwenden Sie diese Methode
quelle
Natürlich könnten Sie überschreiben
setUserVisibleHint
odersetMenuVisibility
aber wenn Sie aufContext
oder zugreifen müssenActivity
, werden sie dort null sein! Es gibt eine andere Methode, beionStart
der der Kontext immer verfügbar ist. Sie wird jedoch beim Erstellen eines Fragments nur einmal aufgerufen. Wenn Sie in einem Pager zwischen Ihren Fragmenten wechseln, werden Sie feststellen, dass sie in der zweiten Ansicht und danach nicht aufgerufen wird .Also ... was soll ich jetzt tun?
Die Problemumgehung ist recht einfach und kann sowohl
onStart
für den ersten als auchsetMenuVisibility
für den späteren Besuch verwendet werden. Ihr Code wird wahrscheinlich wie folgt aussehen:Fragmentklasse:
Dieser Weg
Context
steht derdoSth()
Methode immer zur Verfügung .quelle
Nur das hat bei mir funktioniert !! und
setUserVisibleHint(...)
ist jetzt veraltet (ich habe am Ende Dokumente angehängt), was bedeutet, dass einige andere Antworten veraltet sind ;-)Getestet und funktioniert
NaviagationDrawer
auch,isMenuVisible()
wird es immer wieder gebentrue
(undonResume()
scheint genug, aber wir wollen auch unterstützenViewPager
).quelle