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 ...
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");
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)
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(...)
.
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
avant onClick
utiliser ce code
ViewCompat.setTransitionName(holder.ivImage, "value");