Wenn Sie von einer anderen Aktivität zu DialogFragment zurückkehren, wird meine Eingabe-Animation wiederverwendet
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
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.
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.