다른 활동에서 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

재활용 뷰는 특히 각 시나리오에서 약간 씩 다르게하려는 경우 항상 문제가 될 수 있습니다.

이 대화 상자의 재활용을 중지하고 대신 각기 다른 경우에 대해 특정 대화 상자를 만들 거나 애니메이션을 언제 / 무엇을 사용할지 정의 하는 플래그를 대화 상자에 전달하는 것이 좋습니다 .