Je joue avec des fragments dans Android.
Je sais que je peux modifier un fragment en utilisant le code suivant:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Ma question est, dans un fichier Java, comment puis-je obtenir l'instance de fragment actuellement affichée?
Réponses:
Lorsque vous ajoutez le fragment dans votre transaction, vous devez utiliser une balise.
... et plus tard si vous souhaitez vérifier si le fragment est visible:
Voir également http://developer.android.com/reference/android/app/Fragment.html
la source
Je sais que c'est un ancien poste, mais j'avais déjà eu des problèmes avec lui auparavant. Trouvé une solution qui était de le faire dans la
onBackStackChanged()
fonction d'écouteCela a fonctionné pour moi car je ne voulais pas parcourir chaque fragment que je dois trouver un qui est visible. J'espère que ça aide quelqu'un d'autre aussi.
la source
.getFragmentManager
type de rapport est incompatible, comme dans mon cas, c'est parce que j'utilisais leandroid.support.app.v4.Fragment
, auquel cas la bonne méthode à utiliser estgetSupportFragmentManager
findFragmentByTag()
à la place defindFragmentById
, si vous avez fourni une balise à fragmenter lors de son ajout àfragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Voici ma solution que je trouve pratique pour les scénarios à faible fragment
la source
fragment
peut être nul dans certains scénarios, comme lorsque vous ouvrez la pile arrière. Donc une meilleure utilisationif (fragment != null && fragment.isVisible())
.Chaque fois que vous montrez un fragment, vous devez le mettre en backstack:
Et puis, lorsque vous devez obtenir le fragment actuel, vous pouvez utiliser cette méthode:
la source
addToBackStack(tag)
, mais que se passe-t-il si vous ne souhaitez pas ajouter le fragment à la pile arrière?Ce que j'utilise pour trouver le fragment d'affichage actuel est dans le code ci-dessous. C'est simple et ça marche pour moi maintenant. Il s'exécute dans l'activité qui détient les fragments
la source
fragManager.getFragments().size()
au lieu degetBackStackEntryCount()
car ils ne sont pas nécessairement égaux (ce qui est mon cas). Sinon, vous pouvez obtenir un crash avec IndexOutOfBoundsExceptionFaçon Kotlin;
la source
getFragments()
fonction frameworks , qui est API 26 et plus.La manière réactive :
la source
Ma méthode est basée sur try / catch comme ceci:
Mais il peut y avoir une meilleure façon ...
la source
Eh bien, cette question a suscité beaucoup de vues et d'attention, mais ne contenait toujours pas la solution la plus simple de mon côté - utiliser getFragments ().
la source
getSupportFragmentManager().getFragments()
vous donne une liste mais qui peut contenir des valeurs nulles, si le dernier fragment vient d'être extrait du backstack. Eq: Si vous vérifiez votre chemin à l'intérieur de laonBackStackChanged()
méthode et que vous appelezpopBackStack()
quelque part, alors lemCurrentFragment
seranull
.Vous pouvez interroger quel fragment est chargé dans votre cadre de contenu Activités et récupérer la classe de fragment ou le fragment «nom simple» (sous forme de chaîne).
Usage:
Les sorties:
la source
C'est un peu tard, mais pour tous ceux qui sont intéressés: si vous connaissez l'index du fragment souhaité dans FragmentManager, obtenez simplement une référence et vérifiez la fonction isMenuVisible ()! ici :
Si c'est
true
visible pour l'utilisateur et ainsi de suite!la source
isVisible() == true
,getView() != null
. De plus, dans mon codegetBackStackEntryCount
est toujours nul. Même si je n'utilise pas de menu,isMenuVisible()
c'est jusqu'à présent le seul discriminant qui semble pointer de manière fiable vers le fragment actuellement «actif». ty1)
2)
3)
la source
Si vous arrivez ici et que vous utilisez Kotlin:
R.id.fragment_container
est l'id
endroit où lefragment
présente sur leuractivity
Ou si vous voulez une meilleure solution:
la source
Inspiré par la réponse de Tainy , voici mes deux cents. Peu modifié de la plupart des autres implémentations.
Remplacez-le
"myActivity"
par «ceci» s'il s'agit de votre activité actuelle ou utilisez une référence à votre activité.la source
Il y a une méthode appelée
findFragmentById()
dansSupportFragmentManager
. Je l'utilise dans le conteneur d'activités comme:Voilà comment obtenir votre courant
Fragment
. Si vous avez des coutumesFragment
et devez vérifier de quoiFragment
il s'agit, j'utilise normalementinstanceof
:la source
Si vous utilisez
AndroidX Navigation
:Pour plus d'informations sur ce composant de navigation: https://developer.android.com/guide/navigation/navigation-getting-started
la source
your_navhost
.C'est un moyen simple d'obtenir le fragment actuel.
la source
La réponse de Sev fonctionne lorsque vous appuyez sur le bouton de retour ou que vous modifiez le backstack.
J'ai cependant fait quelque chose de légèrement différent. J'ai une configuration d'écouteur de changement de backstack sur un fragment de base et ses fragments dérivés et ce code est dans l'écouteur:
la source
C'est du travail pour moi. J'espère que cela va aider quelqu'un.
la source
Si vous obtenez l'instance actuelle de Fragment de l'activité parent, vous pouvez simplement
Il s'agit en fait de l'instance actuelle de fragment qui est remplie sur la vue. J'ai eu le même problème. J'ai dû charger le même fragment deux fois en en gardant un sur le backstack.
La méthode suivante ne fonctionne pas. Il obtient juste un fragment qui a la balise. Ne perdez pas votre temps avec cette méthode. Je suis sûr qu'il a ses utilisations, mais pour obtenir la version la plus récente du même fragment n'en fait pas partie.
la source
Découvrez cette solution. Cela a fonctionné pour moi d'obtenir le fragment actuel.
la source
la source
Eh bien, je suppose que c'est la réponse la plus simple à cette question. J'espère que ça aide.
la source
Voici une solution Kotlin:
Manière simplifiée:
la source
Un moyen simple de le faire:
la source
Dans l'activité principale, la méthode onAttachFragment (Fragment fragment) est appelée lorsqu'un nouveau fragment est attaché à l'activité. Dans cette méthode, vous pouvez obtenir l'instance du fragment actuel. Cependant, la méthode onAttachFragment n'est pas appelée lorsqu'un fragment est extrait de la backstack, c'est-à-dire lorsque le bouton de retour est enfoncé pour placer le fragment supérieur au sommet de la pile. Je recherche toujours une méthode de rappel qui est déclenchée dans l'activité principale lorsqu'un fragment devient visible à l'intérieur de l'activité.
la source
Dans le cas de fragments déroulants, lorsque votre instance d'utilisation de la classe ViewPager suppose mVeiwPager, vous pouvez appeler mViewPager.getCurrentItem () pour obtenir le numéro actuel du fragment int.
dans MainLayout.xml
dans MainActivity.kt
la source
J'ai trouvé
findFragmentByTag
que ce n'était pas pratique. Si vous en avezString currentFragmentTag
dans votreActivity
ou parentFragment
, vous devez l'enregistreronSaveInstanceState
et le restaureronCreate
. Même si vous le faites, lors de laActivity
recréation,onAttachFragment
sera appelé avantonCreate
, vous ne pouvez donc pas l'utilisercurrentFragmentTag
dansonAttachFragment
(par exemple, mettre à jour certaines vues en fonction decurrentFragmentTag
), car il n'est peut-être pas encore restauré.J'utilise le code suivant:
Le document
FragmentManager
indiquant queLorsque vous devez faire des choses en fonction du type de fragment actuel, utilisez simplement
getCurrentFragment() instance of MyFragment
au lieu decurrentFragmentTag.equals("my_fragment_tag")
.Notez que
getCurrentFragment()
inonAttachFragment
n'obtiendra pas la pièceFragment
jointe, mais la précédente attachée.la source
J'ai dû le faire très récemment et aucune des réponses ici ne convenait vraiment à ce scénario.
Si vous êtes sûr qu'un seul fragment sera visible (plein écran), alors voulez vraiment trouver ce qui se trouve en haut du backstack. Par exemple, comme
Kotlin
pourFragment
:Et utilisez-le comme:
la source
Vous pouvez le faire très facilement également avec une URL dans logcat qui vous redirigera vers le code source du code source du fragment actuel. Tout d'abord, vous devez ajouter un OnBackStackChangedListener dans l'activité hôte comme -
Et l' implémentation OnBackStackChangedListener est -
Et la méthode getStackTopName () est -
la source