DialogFragment 이것저것
첫번째.
DialogFramgment 를 사용할때 setRetainInstance(true) 를 적용하여 사용하면
orientation 변경등 configuration 이 변경되어 activity 가 재생성이 되었을때 DialogFramgent 가 다시 나타나지 않고 사라지는 문제가 있다.
이는 아래와 같은 workaround 로 해결 가능하다.
@Override
public void onDestroyView(){
if (getDialog() != null && getRetainInstance()) {
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}
두번째.
DialogFragment 가 화면상에 떠있는동안 home 을 눌러 화면에서 사라지게 한다.
그런 상태에서 DialogFragment 의 dismiss 가 호출되면 다음과 같은 에러가 발생한다.
화면에서 사라지면서 onSaveInstanceSate가 호출된 상태에서 resume 되지 않고 dismiss를 하면 발생하게 된다.
E/AndroidRuntime(19229): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(19229): at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1323)
E/AndroidRuntime(19229): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1341)
E/AndroidRuntime(19229): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)
E/AndroidRuntime(19229): at android.app.BackStackRecord.commit(BackStackRecord.java:575)
E/AndroidRuntime(19229): at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)
E/AndroidRuntime(19229): at android.app.DialogFragment.dismiss(DialogFragment.java:258)
이 경우에는
dismiss를 호출하지 않고
dismissAllowingStateLoss() 로 종료해주면 된다.
개인적으로 dismissAllowingStateLoss() 를 사용하고 싶지 않은데
dismiss는 어차피 명시적으로 호출해 주는 것이고 확실히 종료시킨다는 의미이므로 써도 상관없을것 같다.
그런데 commit() 도 마찬가지 인데 이에 대한 처리는 좀 신중해야 할것으로 보인다.
참고 : http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html