9

Chcę iść z widoku listy do widoku szczegółów i dlatego używam następujących OnClickListener w moim liście:Fragment Transakcje z przejściowymi - unikalny transitionNames są wymagane

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

Moi zwracają unikatowe nazwy, mam dwa różne widoki, ale nadal nie działa. Już skomentował zbędnych funkcji na zewnątrz i napisał kilka unikatowych nazw transakcyjne tam ręką ... Ale nadal, otrzymuję ten wyjątek, w wierszu pierwszym addSharedElement:

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

EDIT

Bez wspólnych elementów wszystko działa idealnie ...

Odpowiedz

23

Problem polega na tym, że addSharedElement NIE ustawia nazwy transakcji widoku!

Więc w moim przykładzie będę musiał ustawić go z następującym kodem:

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

PRZED dodam to widoki na FragmentTransaction ...

Następnie następujące prace w porządku i zgodnie z oczekiwaniami:

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

Dziękuję bardzo za to! –

0

Jeśli twoja onClickListener jest częścią twojego fragmentu, a nie rodzicem Activity, to robisz coś źle tutaj. Twój fragment powinien powiadamiać aktywność rodziców o tym, czego chce, a Activty powinna sobie z tym poradzić (np. Zastępując fragmenty itp.). Fragment nigdy nie powinien robić tego sam. Jeśli potrzebujesz tylko przejścia od widoku szczegółowego do listy, zakładam, że wprowadziłeś swój widok szczegółów z tej listy. Jeśli tak, potrzebujesz tylko ostatniego elementu (fragmentu fragmentu) od ostatniego stosu. Patrz: https://developer.android.com/reference/android/app/FragmentManager.html

+0

tylko po to, aby wyjaśnić, jedynym problemem jest animacja wspólnych elementów ... Zmiana fragmentów i tak działa dobrze. Z drugiej strony, masz rację, powinno być zrobione w działaniu ... Byłem po prostu leniwy, aby umieścić tam funkcję, ponieważ mój przepływ fragmentów jest naprawdę łatwy ... – prom85

0

przed onClick

użycie tego co de

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