MainActivity에서 DialogFragment를 상속받은 DectionChooser라는 클래스를 만들고
DetectionChooser().show(supportFragmentManager, "")
라고 호출 했더니 IllegalStateException: Can not perform this action after onSaveInstanceState 라는 에러가 발생했다.
전에도 이와 비슷한 에러가 발생한 적이 있는데 dismiss()를 호출하니까 같은 에러가 발생했었다. 이때는 구글링 해보니 dismissAllowingStateLoss()라는 함수를 호출해주면 간단히 해결 되었다. 그래서 showAllowingStateLoss()라는 함수가 있을꺼 같아서 찾아보니 없다.
그래서 구글링을 하다가 아래 사이트를 참고해서 해결 할 수 있었다.
https://gogorchg.tistory.com/entry/Android-Can-not-perform-this-action-after-onSaveInstanceState [항상 초심으로]
에러가나는 이유는 위 사이트를 들어가면 자세하게 설명되어 있지만 간단히 설명 하자면
onSaveInstanceState 함수를 호출한 상태에서 commit 함수를 호출 했을 때 발생 한다고 한다.
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
}
show 함수 안에 commit()이라는 함수가 호출되고 있는데 이거를 commitAllowingStateLoss()로 바꿔서 호출을 하면 된다. 하지만 DialogFragment 파일을 바로 수정 할 수는 없어서 다른 방법으로 해결했다.
기존에 show함수를 호출 할때 FragmentManager의 매개변수로 supportFragmentManager를 넘겨준다. show 함수에서는 FragmentManager를 받아서 FragmentTransaction로 바꾼다음 뛰울 Fragment와 tag를 add하고 commit을 하는데 commitAllowingStateLoss를 호출 할 수 있도록 바꿔주면 된다.
위 말을 코드로 써보면 아래와 같다.
supportFragmentManager.beginTransaction().add(DetectionChooser(), "").commitAllowingStateLoss()
위에서 DetectionChooser는 DialogFragment를 상속받은 클래스다.
나는 Kotlin으로 하는 중이라 Java를 쓰는 사람이랑 코드가 살짝 다르다. Java를 쓰는 사람은 위에 올려놓은 사이트에 들어가면 Java로 작성된 코드 예시도 있다.