Wracając do DialogFragment z innego działania, ponownie wykorzystuję moją animację wprowadzania
Mam działanie (A), które tworzy DialogFragment. W tym DialogFragment mam przycisk, który tworzy nowe działanie (B). Po zakończeniu działania B wyświetla DialogFragment z działania A i ponownie wykorzystuje tę niestandardową animację, którą ustawiłem. Jak zapobiec ponownemu użyciu tej animacji przez DialogFragment po powrocie do działania A?
Ta odpowiedź działa na niektórych urządzeniach, jednak na niektórych zawiesza całe okno (stąd wersja kontrolna)
@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
Oto jak tworzę niestandardową animację wejścia / wyjścia 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>
Oto kod do tworzenia DialogFragment:
https://pastebin.com/k1c6nz3p
Odpowiedzi
Należy wyłączyć animację w metodzie onPause () metody DialogFragment zamiast metody onStop () . Wystarczy usunąć wszystkie linie kodu masz aktualnie w OnStop () metody i dodać OnPause () z poniżej linii kodu:
@Override
public void onPause() {
super.onPause();
if(getDialog()!=null)
getDialog().getWindow().setWindowAnimations(-1);
}
Robiąc to w metodzie onPause (), wyłączasz wszystkie animacje okien, nie blokując też żadnych zdarzeń dotykowych.
Recykling widoków zawsze może być problematyczny, zwłaszcza jeśli zamierzasz nieco różnić się w każdym scenariuszu.
Zalecałbym, abyś przestał przetwarzać ten dialog i zamiast tego utworzył osobny dialog dla każdego z twoich różnych przypadków , albo po prostu przekazał flagę do swojego okna dialogowego określającą, co / kiedy używać animacji.