web-dev-qa-db-fra.com

Fragment Transactions avec transition - Un nom de transition unique est requis

Je souhaite passer d’une vue de liste à la vue de détail et j’utilise par conséquent OnClickListener dans ma liste:

@Override
public void onClick(View view)
{
    Bet bet = (Bet)view.getTag();
    FragmentManager fm = getActivity().getSupportFragmentManager();
    BetDetailFragment f = BetDetailFragment.create(bet);
    String tag = f.getClass().getName();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
    {
        setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(Android.R.transition.move));
        f.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(Android.R.transition.move));
    }

    FragmentTransaction ft = fm.beginTransaction()
            .replace(R.id.frame_container, f, tag)
            .addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
    {
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo1(bet) + "|" + view.findViewById(R.id.ivLogo1));
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo2(bet) + "|" + view.findViewById(R.id.ivLogo2));
        ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");//TransitionUtil.getTransitionNameBetLogo1(bet));
        ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");//TransitionUtil.getTransitionNameBetLogo2(bet));
    }
    ft.commit();
}

Mes fonctions renvoient des noms uniques, j'ai deux vues différentes, mais cela ne fonctionne toujours pas. J'ai déjà commenté des fonctions inutiles et écrit à la main des noms de transaction uniques ... Mais je reçois quand même cette exception. , dans la ligne de la première addSharedElement:

Java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
        at Android.support.v4.app.BackStackRecord.addSharedElement

MODIFIER

Sans les éléments partagés, tout fonctionne parfaitement bien ...

18
prom85

Le problème est que addSharedElement ne définit PAS le nom de transaction de la vue!

Donc, dans mon exemple, je devrais le définir avec le code suivant:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "1");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "2");

AVANT d’ajouter cette vue à la FragmentTransaction... 

Après cela fonctionne bien et comme prévu:

ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");
ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");
38
prom85

Vous devez définir le même nom de transition dans l'élément de présentation XML de chaque fragment. Par exemple:

Fragment A:

<TextView
 Android:id="@+id/my_text_view"
 ...
 Android:transitionName="transtion_name_example"/>

Fragment b:

<TextView
 Android:id="@+id/my_text_view"
 ...
 Android:transitionName="transtion_name_example"/>

Et le code ressemblera à ceci:

yourTransaction.addSharedElement(view, view.transactionName)
1
ycesar

Vous devez uniquement définir une transitionName sur votre élément partagé. Il n'est pas nécessaire de le choisir exactement égal au nom de votre élément partagé(qui a été passé comme second argument de la méthode addSharedElement()). 

Ce nom (deuxième paramètre de addSharedElement()) DOIT être égal à transitionName de élément partagé dans le fragment de destination. Voir ici .


Donc, il suffit d'insérer:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "AnyThing");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "EveryThing");

avant d'appeler addSharedElement(...).

1
Mir-Ismaili

Si votre onClickListener fait partie de votre fragment, et non le parent Activity, alors vous faites des choses fausses ici. Votre fragment doit notifier à l’activité parent ce qu’il veut et Activty doit y répondre (en remplaçant les fragments, etc.). Fragment ne devrait jamais faire cela seul. De même, si tout ce dont vous avez besoin est de passer de la vue détaillée à la liste, je suppose que vous avez saisi votre vue détaillée à partir de cette liste. Si c'est le cas, il vous suffit d'extraire le dernier élément (fragment de la vue fragmentée) de la pile. Voir: https://developer.Android.com/reference/Android/app/FragmentManager.html

0
Marcin Orlowski

avant onClick

utiliser ce code

ViewCompat.setTransitionName(holder.ivImage, "value");
0
Ahamadullah Saikat