without - viewpager android




Les transitions d'éléments partagés par fragment ne fonctionnent pas avec ViewPager (2)

Mon application contient une vue qui consiste en un ViewPager constitué d'une poignée de fragments. Lorsque vous cliquez sur un élément de l'un de ces fragments, le comportement attendu est que l'élément partagé (dans ce cas une image) passe au fragment qui affiche plus d'informations sur le contenu cliqué.

Voici une vidéo très simple de ce à quoi elle devrait ressembler:

https://dl.dropboxusercontent.com/u/97787025/device-2015-06-03-114842.mp4

Ceci utilise simplement une transition Fragment-> Fragment.

Le problème se pose lorsque vous placez le fragment de départ dans un ViewPager. Je suppose que cela est dû au fait que ViewPager utilise le gestionnaire de fragments enfant de son fragment parent, qui est différent du gestionnaire de fragments de l'activité, qui gère la transaction de fragment. Voici une vidéo de ce qui se passe:

https://dl.dropboxusercontent.com/u/97787025/device-2015-06-03-120029.mp4

Comme je l'ai expliqué ci-dessus, je suis pratiquement certain que le problème concerne le gestionnaire de fragments enfant par rapport au gestionnaire de fragments de l'activité. Voici comment je fais la transition:

SimpleFragment fragment = new SimpleFragment();

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.am_list_pane, fragment, fragment.getClass().getSimpleName());

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    TransitionSet enterTransition = new TransitionSet();
    enterTransition.addTransition(new ChangeBounds());
    enterTransition.addTransition(new ChangeClipBounds());
    enterTransition.addTransition(new ChangeImageTransform());
    enterTransition.addTransition(new ChangeTransform());

    TransitionSet returnTransition = new TransitionSet();
    returnTransition.addTransition(new ChangeBounds());
    returnTransition.addTransition(new ChangeClipBounds());
    returnTransition.addTransition(new ChangeImageTransform());
    returnTransition.addTransition(new ChangeTransform());

    fragment.setSharedElementEnterTransition(enterTransition);
    fragment.setSharedElementReturnTransition(returnTransition);

    transaction.addSharedElement(iv, iv.getTransitionName());
}

transaction.addToBackStack(fragment.getClass().getName());

transaction.commit();

Cela fonctionne bien lorsque les deux fragments sont gérés par le gestionnaire de fragments de l'activité, mais lorsque je charge un ViewPager comme ceci:

ViewPager pager = (ViewPager) view.findViewById(R.id.pager);
pager.setAdapter(new Adapter(getChildFragmentManager()));

Les enfants de ViewPager ne sont pas gérés par l'activité et cela ne fonctionne plus.

Est-ce un oubli de l'équipe Android? Y at-il un moyen de retirer ceci? Merci.


Je me suis cogné la tête contre le mur avec celui-ci récemment. Tout ce que je voulais, c'était un fragment dans ViewPager pour lancer un autre fragment avec une belle transition d'élément partagé de type carte en expansion. Aucune des suggestions ci-dessus ne fonctionnant pour moi, j'ai décidé de lancer une activité de style dialogue:

<style name="AppTheme.CustomDialog" parent="MyTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">true</item>
</style>

Ensuite, pour lancer l'activité à partir du fragment:

Intent intent = new Intent(getContext(), MyDialogActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat
                        .makeSceneTransitionAnimation(getActivity(),
                                Pair.create(sharedView, "target_transition"));
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());

Dans la disposition Fragment, mettez un androïde: nom_session sur la sharedView et dans la présentation Activité, indiquez: nom_session = "target_transition" (identique au deuxième argument de Pair.create ()).






android-transitions