Volver a DialogFragment desde otra actividad reutiliza mi animación de entrada

Dec 06 2020

Tengo una actividad (A) que crea un DialogFragment. En ese DialogFragment, tengo un botón que crea una nueva Actividad (B). Cuando termino la Actividad B, muestra el DialogFragment de la Actividad A y reutiliza esa animación personalizada que configuré. ¿Cómo evito que mi DialogFragment reutilice esa animación cuando regrese a la Actividad A?

Esta respuesta funciona para algunos dispositivos, sin embargo, congela toda la ventana en algunos (de ahí la versión de verificación)

@Override
public void onStop() {
    super.onStop();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
        getDialog().getWindow().setWindowAnimations(-1);
    }
}

https://stackoverflow.com/a/64454784/11110509

Así es como estoy creando mi animación personalizada de entrada / salida de DialogFragment:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {        
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.FragmentDialogAnim;
    return dialog;
}
<style name="FragmentDialogAnim">
    <item name="android:windowEnterAnimation">@anim/loginactivity_left_to_right</item>
    <item name="android:windowExitAnimation">@anim/loginactivity_right_to_left</item>
</style>

loginactivity_left_to_right:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

loginactivity_right_to_left:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="-100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

Aquí está el código para crear DialogFragment:

https://pastebin.com/k1c6nz3p

Respuestas

2 MariosP Dec 14 2020 at 17:26

Debe deshabilitar la animación en el método onPause () de su DialogFragment en lugar del método onStop () . Simplemente elimine todas las líneas de código que tiene actualmente en el método onStop () y agregue onPause () con las siguientes líneas de código:

@Override
public void onPause() {
  super.onPause();
  if(getDialog()!=null)
    getDialog().getWindow().setWindowAnimations(-1);
 }

Al hacerlo en el método onPause (), deshabilita todas las animaciones de la ventana sin también congelar los eventos táctiles.

IvanGarza Dec 13 2020 at 14:03

Las vistas de reciclaje siempre pueden ser problemáticas, especialmente si desea que sean ligeramente diferentes en cada escenario.

Yo recomendaría que dejes de reciclar este Diálogo y en su lugar crees un Diálogo específico para cada uno de tus diferentes casos , o que simplemente pases una bandera en tu Diálogo definiendo qué / cuándo usar las animaciones.