別のアクティビティからDialogFragmentに戻ると、入力アニメーションが再利用されます

Dec 06 2020

DialogFragmentを作成するアクティビティ(A)があります。そのDialogFragmentには、新しいアクティビティ(B)を作成するボタンがあります。アクティビティBを終了すると、アクティビティAのDialogFragmentが表示され、設定したカスタムアニメーションが再利用されます。アクティビティAに戻るときに、DialogFragmentがそのアニメーションを再利用しないようにするにはどうすればよいですか?

この回答は一部のデバイスで機能しますが、一部のデバイスではウィンドウ全体がフリーズします(したがってチェックバージョン)

@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

onStop()メソッドではなく、DialogFragmentのonPause()メソッドでアニメーションを無効にする必要があります。onStop()メソッドに現在あるコードのすべての行を削除し、以下のコード行を使用してonPause()を追加するだけです。

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

onPause()メソッドでこれを行うことにより、タッチイベントをフリーズすることなく、すべてのウィンドウアニメーションを無効にすることができます。

IvanGarza Dec 13 2020 at 14:03

ビューのリサイクルは、特にシナリオごとにわずかに異なるようにする場合は、常に問題になる可能性があります。

このダイアログのリサイクルを停止して、さまざまなケースごとに特定のダイアログを作成するか、アニメーションをいつ使用するかを定義するフラグをダイアログに渡すことをお勧めします