Fragment Shared Element transition

#1

Bonjour à tous,

Je n’arrive pas a faire excactement ce que je veux avec les transitions à l’initialisation de mes fragments:

 val fragmentTransaction = fragmentManager.beginTransaction()
    val fragments = fragmentManager.fragments
    if (fragments.isNotEmpty())
        for (oldFragment in fragments)
            if (oldFragment.isAdded && (!second || oldFragment.tag?.substring(0, userId.length)!!.contains(fragmentTag)))
                fragmentTransaction.hide(oldFragment)

    //create or show
    var fragment = fragmentManager.findFragmentByTag(fragmentTag + userId) as? F_Base

    if (fragment == null || mKillFrags.contains(fragmentTag) || killFragment) {
        if (fragment != null)
            fragmentTransaction.remove(fragment)

        fragment = createFragmentByTag(fragmentTag, bundle)

        if (fragment == null) {
            UIUtils.broadcastMessage(R.string.error)

            return false
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            fragment.sharedElementEnterTransition = DetailsTransition()
            fragment.sharedElementReturnTransition = null
            fragment.enterTransition = Fade()
            fragment.exitTransition = null
        }

        //todo test animation
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && sharedView.isNotEmpty()) {
            for (view in sharedView)
                fragmentTransaction.addSharedElement(view, view.transitionName.substring(0, view.transitionName.lastIndexOf("_")))
            fragmentTransaction.replace(content.id, fragment, fragmentTag)
        } else
        fragmentTransaction.add(content.id, fragment, fragmentTag + userId)
    } else {
        fragmentTransaction.show(fragment)
    }
    fragmentTransaction.commitAllowingStateLoss()

Dans ce cas les transitions fonctionne car l’initialisation des fragments passent par fragmentTransaction.replace() mais je n’ai pas envie de détruire mon fragment courant pour autant. Sauf que si je laisse que fragmentTransaction.add() ma transition n’est pas prise en compte.

Avez vous une solution ?

#2

Je n’ai pas encore utilisé les fragments, mais je suppose que la solution est sur stackoverflow ?

#3

Je ne suis pas certain de ce que tu cherches à faire mais si tu veux remplacer un fragment, sans pour autant le supprimer en mémoire (pour pouvoir rapidement le remettre plus tard ?) tu peux le retirer de l’affichage et mettre dans une variable. Comme ça quand tu veux le remettre en place tu n’as qu’à le reprendre plutôt que d’en créer un nouveau.

Conseil non lié : tu devrais éviter les if et les for sans accolades (même s’il n’y a qu’une seule ligne dépendante). Ça rend le code beaucoup plus difficile à lire.

#4

Oui c’est ce que je fait avec fragmentTransaction.hide(oldFragment) et fragmentTransaction.show(fragment)

Moi le problème que j’ai est au niveau de l’animation.

Merci du conseil pour les if et for