본문 바로가기

지식쌓기

DialogFragment 이것저것

첫번째.


DialogFramgment 를 사용할때 setRetainInstance(true) 를 적용하여 사용하면

orientation 변경등 configuration 이 변경되어 activity 가 재생성이 되었을때 DialogFramgent 가 다시 나타나지 않고 사라지는 문제가 있다. 


http://stackoverflow.com/questions/12433397/android-dialogfragment-disappears-after-orientation-change


이는 아래와 같은 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