9

Ich möchte aus einer Listenansicht in die Detailansicht gehen und deshalb verwende ich OnClickListener in meiner Liste folgende:Fragment Transaktionen mit Übergang - Einzigartige transitionNames erforderlich

@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(); 
} 

Meine Funktionen eindeutige Namen zurückgeben, ich habe zwei verschiedene Ansichten, aber es funktioniert immer noch nicht. bemerkte ich bereits unnötige Funktionen und einige einzigartige Transaktionsnamen dort schrieb von Hand ... Aber noch, bekomme ich diese Ausnahme in der Zeile des ersten addSharedElement:

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

EDIT

Ohne die geteilten Elemente funktioniert alles einwandfrei ...

Antwort

23

Das Problem ist, dass addSharedElement legt nicht den Transaktionsnamen der Ansicht!

So in meinem Beispiel würde ich es mit folgenden Code zu setzen haben:

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

, bevor ich diese Ansichten zum FragmentTransaction hinzufügen ...

Danach folgt funktioniert gut und wie erwartet:

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

Vielen Dank dafür! –

0

Wenn dein onClickListener Teil deines Fragments ist, nicht Elternteil Activity, dann machst du Sachen hier falsch. Ihr Fragment sollte die Elternaktivität benachrichtigen, was es will, und Activty sollte damit umgehen (d. H. Durch Ersetzen von Fragmenten usw.). Fragment sollte das niemals alleine machen. Wenn Sie nur von der Detailansicht zur Liste gehen müssen, nehme ich an, dass Sie Ihre Detailansicht aus dieser Liste heraus aufgerufen haben. Wenn dies der Fall ist, müssen Sie nur das letzte Element (Fragmentansichtsfragment) aus dem hinteren Stapel entfernen. Siehe: https://developer.android.com/reference/android/app/FragmentManager.html

+0

nur zu klären, das einzige Problem ist die Animation der gemeinsamen Elemente ... Fragmente ändern und so funktioniert gut. Zu dem anderen Punkt, du hast Recht, sollte in der Aktivität getan werden ... Ich war nur zu faul, um die Funktion dort zu setzen, da meine Fragmentflüsse sehr einfach sind ... – prom85

0

vor onClick

Verwendung dieses co

de
ViewCompat.setTransitionName(holder.ivImage, "value");