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)해주면 된다.