setcustomanimations overridependingtransition library example activity android transactions fragment transition android-transitions

android - overridependingtransition - setcustomanimations



Fragmentar transacciones con transición: se requieren nombres de transición únicos (5)

Quiero pasar de una vista de lista a la vista de detalles y, por lo tanto, uso el siguiente OnClickListener en mi lista:

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

Mis funciones devuelven nombres únicos, tengo dos vistas diferentes, pero aún así no funciona. Ya comenté funciones innecesarias y escribí algunos nombres de transacción únicos a mano ... Pero aún así, obtengo esta excepción, en la línea del primer addSharedElement :

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

EDITAR

Sin los elementos compartidos, todo funciona perfectamente bien ...


Debe establecer el mismo nombre de transición en el elemento de diseño xml de cada fragmento. Por ejemplo:

Fragmento A:

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

Fragmento B:

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

Y el código será algo así:

yourTransaction.addSharedElement(view, view.transactionName)


El problema es que addSharedElement NO establece el nombre de transacción de la vista.

Así que en mi ejemplo tendría que configurarlo con el siguiente código:

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

ANTES de agregar estas vistas al FragmentTransaction ...

Posteriormente los siguientes trabajos funcionan bien y como se esperaba:

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


Si su onClickListener es parte de su fragmento, no de la Activity padres, entonces está haciendo las cosas mal aquí. Su fragmento debe notificar a la actividad de los padres lo que quiere y Activty debe tratar con él (es decir, reemplazando fragmentos, etc.). Fragmento nunca debe hacer esto por sí mismo. Además, si todo lo que necesita es pasar de la vista detallada a la lista, asumo que ingresó su vista detallada de esa lista. Si es así, todo lo que necesita es sacar el último elemento (fragmento de la vista del fragmento) de la pila posterior. Consulte: https://developer.android.com/reference/android/app/FragmentManager.html


Solo necesitas establecer un nombre de transitionName para tu elemento compartido . No hay necesidad de elegirlo exactamente igual al nombre de su elemento compartido (que se ha pasado como el segundo argumento del método addSharedElement() ).

Este nombre (segundo parámetro de addSharedElement() ) DEBE ser igual al nombre de transitionName del elemento compartido en el fragmento de destino . Ver here

Así que basta con insertar :

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

antes de invocar addSharedElement(...) .


antes onClick

usa este código

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