Revenir à DialogFragment à partir d'une autre activité réutilise mon animation d'entrée

Dec 06 2020

J'ai une activité (A) qui crée un DialogFragment. Dans ce DialogFragment, j'ai un bouton qui crée une nouvelle activité (B). Lorsque j'ai terminé l'activité B, il affiche le DialogFragment de l'activité A et il réutilise cette animation personnalisée que j'ai définie. Comment empêcher mon DialogFragment de réutiliser cette animation lors du retour à l'activité A?

Cette réponse fonctionne pour certains appareils, mais elle gèle toute la fenêtre sur certains (d'où la version de vérification)

@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

Voici comment je crée mon animation d'entrée / sortie DialogFragment personnalisée:

@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>

Voici le code pour créer le DialogFragment:

https://pastebin.com/k1c6nz3p

Réponses

2 MariosP Dec 14 2020 at 17:26

Vous devez désactiver l'animation dans la méthode onPause () de votre DialogFragment au lieu de la méthode onStop () . Supprimez simplement toutes les lignes de code que vous avez actuellement dans la méthode onStop () et ajoutez onPause () avec les lignes de code ci-dessous:

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

En le faisant dans la méthode onPause (), vous désactivez toutes les animations de fenêtre sans également geler les événements tactiles.

IvanGarza Dec 13 2020 at 14:03

Le recyclage des vues peut toujours être problématique, en particulier si vous souhaitez qu'il soit légèrement différent dans chaque scénario.

Je vous recommande soit d'arrêter de recycler cette boîte de dialogue et de créer à la place une boîte de dialogue spécifique pour chacun de vos différents cas , soit de simplement passer un drapeau dans votre boîte de dialogue définissant quoi / quand utiliser les animations.