J'utilise la méthode suivante pour basculer entre les fragments (dans mon NavigationDrawer) en les affichant / les masquant.
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;
}
Ce que je ne sais pas, c'est quelle méthode du cycle de vie des fragments est appelée lorsque je l'affiche ou la masque? (puisqu'il n'y a pas de méthode telle que onShow () ou onHide () je ne sais pas trop quoi utiliser). Je souhaite effectuer des actions spécifiques lors de l'affichage et du masquage d'un certain fragment.
android
android-fragments
lifecycle
fragmenttransaction
Philipp Jahoda
la source
la source
onCreate()
, suivi deonCreateDialog()
, suivi deonCreateView()
Réponses:
Semblable au cycle de vie des activités, Android appelle onStart () lorsque le fragment devient visible.
onStop()
est normalement appelé lorsque fragment devient invisible, mais il peut également être appelé plus tard dans le temps.En fonction de votre disposition, Android peut
onStart()
même appeler lorsque votre fragment n'est pas encore visible, mais qu'il appartient à un conteneur parent visible. Par exemple, ceci est valable pourandroid.support.v4.view.ViewPager
ce qui vous oblige à remplacer laFragment.setUserVisibleHint()
méthode. Dans tous les cas, si vous avez besoin d'enregistrer / désenregistrer des BroadcastReceivers ou d'autres écouteurs, vous pouvez utiliser en toute sécurité des méthodesonStart()
etonStop()
car elles seront toujours appelées.Remarque: certains conteneurs de fragments peuvent conserver les fragments invisibles démarrés. Pour gérer cette situation, vous pouvez passer outre
Fragment.onHiddenChanged(boolean hidden)
. Selon la documentation , un fragment doit être à la fois démarré et visible (non masqué) , pour être visible par l'utilisateur.Mise à jour: Si vous utilisez,
android.support.v4.widget.DrawerLayout
un fragment sous le tiroir reste démarré et visible même lorsque le tiroir est ouvert. Dans ce cas , vous devez utiliserDrawerLayout.setDrawerListener()
et écouteronDrawerClosed()
etonDrawerOpened()
callbacks.la source
onStop
etonPause
ne sont pas appelés lorsqu'un fragment devient invisible à l'aide d'une transaction. NéanmoinsonHiddenChanged
est appelé comme le suggère s1rius réponseJe @Override cette méthode et résout mon problème:
la source
setUserVisibleHint
comme indiqué dans stackoverflow.com/a/18375436/1815624 fonctionnebien sûr, vous pouvez @Override la méthode suivante pour le faire:
la source
getUserVisibleHint()
Le comportement du pager du fragment dans la vue est différent avec le conteneur de fragment normal.
Essayez ce code:
la source
Essayez ce code:
la source
Vous pouvez utiliser «onCreateView» (ou «onActivityCreated») et «onHiddenChanged». Utilisez «onCreateView» pour le premier spectacle et utilisez «onHiddenChanged» pour plus tard. 'setMenuVisibility' n'est pas appelé sur le contrôle de transaction.
la source
Essayez simplement ceci dans votre setUserVisibleHint ()
Et créez ce code dans onCreateView () :
la source
isVisibleToUser && getView() != null
a parfaitement fonctionné pour moi!// tout d'abord vous créez une interface
// Après cela, cette interface implémente l'intérieur de Fragment comme ça
// Maintenant va votre activité puis créez un objet d'interface et appelez à l'intérieur lorsque addOnViewpagerListener
la source
setUserVisibleHint
appelez avantonCreateView
. et vous ne pouvez mettre à jour aucune vue à l'intérieur de setUserVisibleHint que j'utilisepour la visibilité et onHiddenChanged () n'a pas appelé pour la première fois . il appelle lorsque l'état caché change. parce que a
fragment is visible by default
. Afin de réaliser cette méthode pour la première fois, vous devez appelermFragmentTransaction.hide(oldFragment)
alors cela fonctionneraRemarque
si vous souhaitez utiliser l'indicateur setUserVisible et mettre à jour la vue Utilisez cette méthode
la source
Bien sûr, vous pouvez remplacer
setUserVisibleHint
ousetMenuVisibility
mais si vous avez besoin d'accéder àContext
ouActivity
, ils seront nuls là-dedans! Il existe une autre méthodeonStart
qui a toujours le contexte disponible à portée de main, mais elle ne sera appelée qu'une fois lors de la création du fragment et si vous commencez à vous déplacer entre vos fragments dans un pager, vous verrez qu'il ne sera pas appelé dans la seconde vue et après .Alors ... que faire maintenant?
La solution de contournement est assez simple, à utiliser
onStart
pour la première visite etsetMenuVisibility
pour les suivantes. Votre code ressemblera probablement à ci-dessous:Classe de fragment:
Cette méthode
Context
sera toujours disponible pour ladoSth()
méthode.la source
Seul cela a fonctionné pour moi !! et
setUserVisibleHint(...)
est maintenant obsolète (j'ai joint des documents à la fin), ce qui signifie que certaines autres réponses sont obsolètes ;-)Testé et fonctionne également avec
NaviagationDrawer
, il yisMenuVisible()
aura toujours du retourtrue
(et celaonResume()
semble suffisant, mais nous voulons soutenirViewPager
aussi).la source