Wenn Sie von einer anderen Aktivität zu DialogFragment zurückkehren, wird meine Eingabe-Animation wiederverwendet

Dec 06 2020

Ich habe eine Aktivität (A), die ein DialogFragment erstellt. In diesem DialogFragment habe ich eine Schaltfläche, die eine neue Aktivität erstellt (B). Wenn ich Aktivität B beendet habe, wird das DialogFragment aus Aktivität A angezeigt und die von mir festgelegte benutzerdefinierte Animation wird wiederverwendet. Wie verhindere ich, dass mein DialogFragment diese Animation wiederverwendet, wenn ich zu Aktivität A zurückkehre?

Diese Antwort funktioniert für einige Geräte, friert jedoch bei einigen das gesamte Fenster ein (daher die Prüfversion).

@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

So erstelle ich meine benutzerdefinierte DialogFragment-Eingabe- / Beendigungsanimation:

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

Hier ist der Code zum Erstellen des DialogFragments:

https://pastebin.com/k1c6nz3p

Antworten

2 MariosP Dec 14 2020 at 17:26

Sie sollten die Animation in der onPause () -Methode Ihres DialogFragments anstelle der onStop () -Methode deaktivieren . Entfernen Sie einfach alle Codezeilen, die Sie derzeit in der onStop () -Methode haben, und fügen Sie onPause () mit den folgenden Codezeilen hinzu:

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

Wenn Sie dies in der onPause () -Methode tun, deaktivieren Sie alle Fensteranimationen, ohne auch Berührungsereignisse einzufrieren.

IvanGarza Dec 13 2020 at 14:03

Das Recycling von Ansichten kann immer problematisch sein, insbesondere wenn Sie beabsichtigen, dass sie in jedem Szenario leicht unterschiedlich sind.

Ich würde empfehlen, dass Sie entweder aufhören, diesen Dialog zu recyceln, und stattdessen einen spezifischen Dialog für jeden Ihrer verschiedenen Fälle erstellen , oder einfach ein Flag in Ihren Dialog einfügen, um zu definieren, was / wann die Animationen verwendet werden sollen.