J'ai une activité avec les onglets de navigation en bas qui changent les fragments en elle. Lorsque je clique sur ces onglets, à un moment donné, cela cesse de fonctionner. Le code s'exécute très bien car je mets quelques logs dedans. Mais les fragments ne sont pas commutés.FragmentTransaction cacher/montrer ne fonctionne pas parfois
codeest en Kotlin mais il est plutôt droit devant
fun showTabFragment(tag: String) {
val currentFragment: Fragment? = supportFragmentManager.fragments?.lastOrNull()
var fragment = supportFragmentManager.findFragmentByTag(tag)
val fragmentExists = fragment != null
if (fragment == null) {
when (tag) {
TAG_LOGBOOK -> fragment = LogbookFragment()
TAG_RECIPES -> fragment = RecipesFragment()
TAG_PROFILE -> fragment = ProfileFragment()
else -> fragment = MeetingPlacesFragment()
}
}
val transaction = supportFragmentManager.beginTransaction()
if (currentFragment != null) {
Log.i("jacek", "hiding " + currentFragment.javaClass.simpleName)
transaction.hide(currentFragment)
}
if (fragmentExists) {
Log.i("jacek", "showing " + fragment.javaClass.simpleName)
transaction.show(fragment)
} else {
Log.i("jacek", "adding " + fragment.javaClass.simpleName)
transaction.add(R.id.container, fragment, tag)
}
transaction.commit()
}
Les fragments sont assez lourds. Je vais essayer avec quelques légers, mais cela ne devrait pas poser de problème à mon avis. Y a-t-il autre chose que je pourrais essayer?
J'utilise la dernière bibliothèque de soutien - 25.2.0 Aussi je ne suis pas intéressé à remplacer les fragments comme point est d'ajouter une animation sans les recréer Crossfade
Peut-être il y a un problème lorsque vous appelez 'hide()' et ensuite 'show()' sur les mêmes fragments dans la même transaction? Comme quand 'currentFragment' fait référence aux mêmes fragments que' fragment', ce qui peut certainement arriver ici. En parlant de cela, je pense qu'il est faux de prétendre que le dernier fragment de la liste 'supportFragmentManager.fragments' sera le dernier fragment affiché (plutôt le dernier ajouté). Vous devriez soit parcourir tous les 'fragments' et en chercher un qui a' isVisible() 'comme vrai ou simplement stocker la dernière balise fragmentée montrée et la trouver plus tard. –