Wracając do DialogFragment z innego działania, ponownie wykorzystuję moją animację wprowadzania

Dec 06 2020

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

2 MariosP Dec 14 2020 at 17:26

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.

IvanGarza Dec 13 2020 at 14:03

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.