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");