Salir de la animación no funciona; FragmentTransaction animación personalizada no funciona para ocultar

Utilizo mostrar / ocultar para mostrar un fragmento que ocupa parte de la pantalla. Por alguna razón, cuando se muestra el fragmento, se slide_in_left animación slide_in_left , pero cuando el fragmento se oculta no hay animación, el fragmento desaparece. He intentado usar la animación slide_in_left para exit y enter , esto no ayudó. Cuando un seguimiento del código en el paquete de soporte, la animación se crea y el código para mostrarlo se está ejecutando. ( .hide llamada .hide )

 FragmentManager fm = _activity.getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.my_fragment); FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); if (fragment.isHidden()) { ft.show(fragment); fragment.setUserVisibleHint(true); } else { ft.hide(fragment); } ft.commit(); 

Por si acaso aquí está el xml para la animación slide_out_left

 <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-50%p" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_mediumAnimTime" /> </set> 

Editar: Es posible que el problema tenga algo que ver con el hecho de que my_fragment comparte el ancho de la pantalla con otro fragmento que contenga una webview. Cuando .show se ejecuta para my_fragment se vuelve visible y comparte el espacio dentro de una disposición lineal horizontal (cuánto ancho de pantalla cada uno de los dos fragmentos ocupa está determinado por el parámetro de peso).

Personalmente para mí esto es un error con la animación zPosition for Fragment.

Lo que ves es el nuevo fragmento "que aparece" esto es porque el nuevo fragmento se adjunta debajo de la actual.

Así que cuando se trata de animar un fragmento "Over the top" de un fragmento existente, parece que nada está sucediendo, entonces el nuevo sólo "aparece".

He intentado muchos arounds de trabajo, jugando con zPosition (sólo afecta a las ventanas no layouts, por lo que ningún efecto a los fragmentos), onAnimationCreate() trayendo el diseño de la raíz en el frente o incluso en la animación de inicio y detener … parece no hacer nada.

Así que en este momento en el tiempo sin escribir una animación personalizada completa para las transiciones de fragmentos, son un poco buggy en este momento.

Usted puede tener que jugar con. .add(Fragment) espera que se agregue, luego llama .remove(Fragment) quitando el fragmento antiguo, de esta manera el nuevo fragmento se coloca físicamente encima del fragmento existente.

Intenta usar setCustomAnimations (int enter, int exit, int popEnter, int popExit) en lugar de setCustomAnimations (int enter, int exit) Cuando llamas popupbackstack exit animation will not be called

Creo que tuvo la misma situación que surge:

Tengo N fragmentos y quería tener una animación personalizada, pero no quería recargar los fragmentos, por lo que hacer un add y remove o un replace no era una solución, y con el show / hide no podría sincronizar la animación entre Dos fragmentos.

Para arreglarlo tuve que usar un FrameLayout para cada fragmento.

Aquí el código.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_above="@+id/main_bottom_navigation" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/library" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/search" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/discover" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> <com.roughike.bottombar.BottomBar android:id="@+id/main_bottom_navigation" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" app:bb_tabXmlResource="@xml/main_bb_tabs" app:bb_inActiveTabColor="@color/taupegray" app:bb_activeTabColor="@color/green_apple" app:bb_showShadow="true"/> </RelativeLayout> 

Luego, para controlar qué fragmento mostrar:

 private void showFragment(BaseFragment fragment) { Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide_in_from_right); if (fragment instanceof DiscoverFragment) { mDiscoverContainer.bringToFront(); mDiscoverContainer.startAnimation(animation); return; } if (fragment instanceof LibraryFragment) { mLibraryContainer.bringToFront(); mLibraryContainer.startAnimation(animation); return; } if (fragment instanceof SearchFragment) { mSearchContainer.bringToFront(); mSearchContainer.startAnimation(AnimationUtils.loadAnimation(animation); return; } } 

La llave está en la parte bringToFront

Espero que haya sido útil!

Pude conseguir la animación de la salida para trabajar usando .replace en vez de .add

 ft.replace(R.id.container, new MyFragment()); 
  • Cómo borrar backStack de soporte FragmentManager?
  • Ciclo de vida del fragmento - ¿Qué método se llama mostrar / ocultar?
  • Fragmento Transacción cargar la vista vacía, pero el fragmento se muestra después de que el dispositivo giratorio
  • Congelación de la interfaz de usuario cuando la transacción de fragmentos
  • ¿Qué hace exactamente FragmentManager y FragmentTransaction exactamente?
  • Mover fragmento de Android a un contenedor diferente No se puede cambiar el identificador de contenedor de fragmento
  • FragmentTransaction.replace reemplaza sólo el primer Fragment en un contenedor
  • Cómo reemplazar un ViewPager con un fragmento
  • Cambiar el orden z de Fragmentos durante la FragmentTransaction en curso
  • Cómo agregar un fragmento a un diseño de un DialogFragment?
  • Java.lang.IllegalArgumentException: No se encontró ninguna vista para id 0x1020002 (android: id / content) para el fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.