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
- Cómo mostrar el fragmento de entrada sobre el fragmento de salida mientras se anima.
- La biblioteca de la barra de acciones de AppCompat no muestra fragmentos añadidos
- ¿Cómo reemplazar el fragmento C con el fragmento A cuando se pulsa el botón Atrás?
- Android: ¿Cuándo es apropiado utilizar FragmentTransaction.remove?
- Se hace clic en un diseño invisible detrás del fragmento:
<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).
- ¿Cómo se manejan las transacciones de fragmentos cuando el estado de la actividad principal está destinado a ser guardado?
- ViewPager dentro de Fragmento desaparece después de transaction.remove () (Mantener instancia?)
- Android - Hacer traducciones y objectAnimator en el mismo archivo XML
- Fragmento de Android La transacción con animación provoca que el flash blanco
- FragmentManager.getFragmens (). Size () no disminuyen después de FragmentTransaction.remove (Fragment)
- FragmentTransacation con diapositiva en / out animación en> 4 rendimiento
- android.R.id.content como contenedor para Fragment
- ¿Cómo funciona el nuevo FragmentTransaction commitNow () trabajando internamente?
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());
- IBM Worklight – ¿Cómo habilito la depuración de WebView en Android?
- Retrofit @body con @multipart teniendo problema