从另一个 Activity 返回到 DialogFragment 会重复使用我的输入动画

Returning to DialogFragment from another Activity reuses my enter animation

我有一个 Activity (A) 创建 DialogFragment。在该 DialogFragment 中,我有一个创建新 Activity (B) 的按钮。当我完成 Activity B 时,它会显示来自 Activity A 的 DialogFragment 并重新使用我设置的自定义动画。如何防止我的 DialogFragment 在返回 Activity A 时重复使用该动画?

此答案适用于某些设备,但它会在某些设备上冻结整个 window(因此检查版本)

@Override
public void onStop() {
    super.onStop();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
        getDialog().getWindow().setWindowAnimations(-1);
    }
}

这就是我创建自定义 DialogFragment enter/exit 动画的方式:

@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

回收视图总是有问题,尤其是当您希望它在每种情况下略有不同时。

我建议您要么停止回收此对话框,而是为每个不同的案例创建一个特定的对话框,或者您只是传递一个标志进入你的 Dialog 定义 what/when 以使用动画。

您应该在 DialogFragment 的 onPause() 方法而不是 onStop() 方法中禁用动画。只需删除您当前在 onStop() 方法中的所有代码行,并使用以下代码行添加 onPause()

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

通过在 onPause() 方法中执行此操作,您可以禁用所有 window 动画,同时不会冻结任何触摸事件。