Revenir à DialogFragment à partir d'une autre activité réutilise mon animation d'entrée
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
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.
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.