При возврате к DialogFragment из другого действия моя анимация ввода повторно используется

Dec 06 2020

У меня есть Activity (A), который создает DialogFragment. В этом DialogFragment у меня есть кнопка, которая создает новое действие (B). Когда я заканчиваю действие B, он отображает DialogFragment из действия A и повторно использует заданную мной настраиваемую анимацию. Как предотвратить повторное использование этой анимации DialogFragment при возврате к действию A?

Этот ответ работает для некоторых устройств, однако на некоторых он замораживает все окно (отсюда и контрольная версия)

@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

Вот как я создаю свою собственную анимацию входа / выхода 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>

Вот код для создания DialogFragment:

https://pastebin.com/k1c6nz3p

Ответы

2 MariosP Dec 14 2020 at 17:26

Вы должны отключить анимацию в методе onPause () вашего DialogFragment вместо метода onStop () . Просто удалите все строки кода, которые у вас есть в методе onStop (), и добавьте onPause () со следующими строками кода:

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

Делая это в методе onPause (), вы отключаете всю анимацию окна, не останавливая при этом какие-либо события касания.

IvanGarza Dec 13 2020 at 14:03

Повторное использование представлений всегда может быть проблематичным, особенно если вы хотите, чтобы он немного отличался в каждом сценарии.

Я бы рекомендовал либо прекратить повторное использование этого диалога и вместо этого создать конкретный диалог для каждого из ваших различных случаев , либо просто передать флаг в свой диалог, определяющий, что и когда использовать анимацию.