이런 문제에 걸리면 돌부리에 넘어진 것처럼 바쁜 일정에 힘이 빠질때가 있습니다.

제가 만들고자 했던건 

FragmentActivity > Fragment > Activity

즉 Fragment에서 startActivityForResult 로 Activity를 호출뒤 작업완료 후 돌아왔을때

onActivityResult에서 무언가를 할경우 그 무언가의 작업에 따라 제목과 같은 에러가 발생할 수 있습니다.

저 같은 경우에는 또다른 Fragment 로 스위칭 작업을 하는것이 었는데요.

구글링해보니 다이얼로그를 띄우것과 같은 UI관련 작업이 있으면 발생하는 것 같습니다.(시간내서 확인 정확히 해보겠습니다)


여튼 구글링 결론은 이렇습니다. 

1. 원인은 이렇게 설명하고 있습니다.

The bug is that onActivityResult() is called before onStart().


그래서 메세지 의미를 해석해 보면 onSaveInstanceState 이후에 이런 액션(본인의 경우 다른 플래그먼트 호출)을 할수 없다라는 말은 현재 onActivityResult()가 onStart() 작업이 해주는 플래그먼트 상태 복원작업이 되기 이전에 해당 작업은 할수 없다라고 이해가됩니다.


void onSaveInstanceState(Bundle outState)

Called to ask the fragment to save its current dynamic state, so it can later be reconstructed in a new instance of its process is restarted.


2.OS 버그다. 아니다. 논란이 있습니다. 그래서 패치중이다란 의견도 있구요

3. 해결방법은 아래에서 참고하다시피 다양히 제시되고 있습니다.

https://code.google.com/p/android/issues/detail?id=17787

http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult


제가 사용한 방법은 다음과 같습니다. 예제입니다.

    @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {

            case Constants.REQUEST_CODE_CERTIFICATION:

                if (resultCode == getActivity().RESULT_OK) {

                    String realName = data.getStringExtra(Constants.INTENT_DATA_REAL_NAME);

                    Log.d(TAG, "realName:"+realName);

// 에러가 발생했던 코드

//                    SignUpStep3Fragment fragment = new SignUpStep3Fragment(realName);

//                    switchFragment(fragment);


// commitAllowingStateLoss 를 사용해서 상태잃어버리는 것을 허용하는 꼼수

                    SignUpStep3Fragment fragment = new SignUpStep3Fragment(realName);

                    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

                    ft.replace(android.R.id.content, fragment);

                    ft.addToBackStack(null);

                    ft.commitAllowingStateLoss();

                }

        }

    }


 마무리하며..

제시된 방법은 아직은 불완전해보이는 Fragment 라이프사이클을 보완하기 위한 임시방편 책으로 보입니다.

OS 버전 업데이트가 되면 좀더 안전한 Fragment 사용이 되지 않을까 생각됩니다.




Posted by 빈솔B
,