tutorial studio llamar fragments example dinamicos desde con activity abrir android animation fragment

android - studio - llamar un fragment desde un activity



Cómo animar la eliminación de fragmentos (8)

Quiero animar la eliminación de fragmento.

Lo intenté:

getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .remove(myFragment) .commit();

pero el fragmento simplemente desaparece.

Noté que la animación out solo se reproduce con ''replace'', así que traté de reemplazar el fragmento con un Fragment vacío como este:

getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out) .replace(viewId, new Fragment()) .commit();

Pero todavía desaparece desaparece.

Entonces, ¿cómo puedo animar la eliminación de fragmento?


Estuve de acuerdo con hugoc y aquí un código para resolverlo

public class MyActivity extends Activity { //Some thing public void Fragment2BackToFragment1(Fragment fragment1, Fragment fragment2) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); animateExit(fragment2); ft.replace(R.id.main_content, fragment1, "fragment1"); ft.commit(); } private void animateExit(Fragment exitFragment) { if (exitFragment != null) { final View view = exitFragment.getView(); if (view != null) { int anim = R.anim.fade_out; Animation animation = AnimationUtils.loadAnimation(getActivity(), anim); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { view.postDelayed(new Runnable() { @Override public void run() { view.setVisibility(View.GONE); } }, 300); } @Override public void onAnimationRepeat(Animation animation) { } }); view.startAnimation(animation); } } } }


Me inspiré en la respuesta de Zoltish, esta es mi implementación:

1.add este método dentro del fragmento, animará el fragmento fuera de la pantalla a la izquierda:

public void animateOut() { TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0); trans.setDuration(150); trans.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub ((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting(); } }); getView().startAnimation(trans); }

El método que se encuentra en onAnimationEnd () elimina el fragmento de esta manera:

getSupportFragmentManager().beginTransaction(). remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();

2.call la salida animada del fragmento de onBack () de la actividad.

Aclamaciones

por cierto, mi getDensity () es:

public static int getDensity(Context context) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return (int)metrics.density; }

con él calculo el valor de DP para el dispositivo en ejecución actual.


Me lo imaginé.

La vista de salida está animada en el lienzo de la vista de entrada, de modo que si no hay un lienzo de entrada, no hay ningún lienzo para la animación.

Para mostrar la animación que siempre tuve que usar, reemplace y use ingresar fragmentos del mismo tamaño a los que salen. Una vez que la animación finaliza, configuro la vista de los nuevos fragmentos para que desaparezcan.


Puede animar la eliminación configurando esta animación personalizada en el fragmentoTransacción

fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);

El tercer y cuarto params son para eliminar el fragmento


Qué entrar:
es un nuevo fragmento que debe mostrarse

Que salida?
es un fragmento actual que debe ser oculto

Qué popEnter:
es un fragmento previo que debe mostrarse

Qué popExit:
es un fragmento actual que debe ser oculto

Para utilizar estas animaciones, debe orientarlas al mostrar u ocultar los comandos de transacción. Las animaciones de salida no funcionan en los procedimientos de quitar / reemplazar.


Reemplazar con un fragmento vacío, antes del punto de inserción del siguiente fragmento y también demorar la inserción del siguiente fragmento (en 200 ms) para que la animación de salida del fragmento en blanco pueda reproducirse, resolvió mi problema.

Este es el código para insertar un fragmento vacío con la animación de salida.

getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.exit, R.anim.pop_exit) .replace(R.id.fragmentLayout, new Fragment()) .commit();

Exit.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="-100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="200"/> </set>

pop_exit.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="200"/> </set>


Vi esto cuando tuve problemas similares y pensé en dejar caer una nota rápida.

En lugar de crear un fragmento ficticio para reemplazar el existente, creo que debería animar la vista de fragmentos actual. Cuando termina la animación, simplemente puedes eliminar el fragmento.

Así es como lo hice:

final FragmentActivity a = getSherlockActivity(); if (a != null) { //Your animation Animation animation = AnimationUtils.loadAnimation(a, R.anim.bottom_out); animation.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)); //You can use AnimationListener, MagicAnimationListener is simply a class extending it. animation.setAnimationListener(new MagicAnimationListener() { @Override public void onAnimationEnd(Animation animation) { //This is the key, when the animation is finished, remove the fragment. try { FragmentTransaction ft = a.getSupportFragmentManager().beginTransaction(); ft.remove(RestTimerFragment.this); ft.commitAllowingStateLoss(); } catch (Exception e) { e.printStackTrace(); } } }); //Start the animation. getView().startAnimation(animation); }


razón como @hugoc dijo

La vista de salida está animada en el lienzo de la vista de entrada, de modo que si no hay un lienzo de entrada, no hay ningún lienzo para la animación.

Para mostrar la animación que siempre tuve que usar, reemplace y use ingresar fragmentos del mismo tamaño a los que salen. Una vez que la animación finaliza, configuro la vista de los nuevos fragmentos para que desaparezcan.

a continuación es el código real:

FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top); transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit(); transaction = manager.beginTransaction(); transaction.remove(removeFragment).commit();