FrontEnd/Android

[Android] Can not perform this action after onSaveInstanceState

Satisfaction 2023. 3. 12. 18:02

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at androidx.fragment.app.FragmentManager.checkStateLoss(FragmentManager.java:1844)
       at androidx.fragment.app.FragmentManager.enqueueAction(FragmentManager.java:1884)
       at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:329)
       at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:294)
       at androidx.fragment.app.DialogFragment.show(DialogFragment.java:260)

fragment transaction commit (dialogFragment show) 한 시점에서 발생하는 오류

 

onSaveInstanceState() 이후 fragment transaction이 커밋되었을 때 발생한다고 한다

 

"상태 저장-> 상태 변경-> 상태 복구" 의 절차를 따를 때

저장과 복구 사이에서 발생한 변경은 복구될 때 포함되지 않아 나쁜 사용자 경험을 제공할 수 있어

상태 저장 후 상태 변경이 발생하면 Exception 을 발생시킨다고 한다.

//as-is
getSupportFragmentManager().beginTransaction().add(R.id.my_fragment, new MyFragment())
  .commit();

//to-be
getSupportFragmentManager().beginTransaction().add(R.id.my_fragment, new MyFragment())
  .commitAllowingStateLoss();

이런 상황에서 "상태 변경"한 것이 "복구될 때 누락되어도 좋다"라고 명시적으로 알려 주기 위해

commit 대신 commitAllowingStateLoss 를 사용하면 된다.

 

DialogFragment를 사용할 때도 해당 오류가 발생할 수 있는데,

이 때도 다른 방법으로 프래그먼트를 커밋(show)해주면 된다.