Fragment 에서 startActivityForResult() 메소드를 사용하여 다른 엑티비티를 실행 후 결과값을 전달받는데 startActivityForResult()를 실행했던 Fragment가 아니라 부모 Activity 나 다른 Fragment에서 해당 이벤트를 처리하고 싶은 경우가 있다.
이런 경우라던지 단순히 다른 Fragment 나 부모 Activity에서 onActivityResult() 를 override 했는데 이벤트를 타지 않는다고 투덜댈 수 있다.
하지만 Fragment 에 스펙을 찬찬히 살펴보면 Fragment 자체도 Fragment.startActivityForResult() 라는 메소드를 가지고 있다. Activitiy.startActivityForResult()를 가지고 있듯이 말이다.
예를 들어 1번 Fragment 에서 startActivityForResult() 를 실행했다면 해당 결과는 1번 Fragment의 onActivityResult() 메소드로 전달된다.
그럼 부모 Activitiy 라던지 1번 Fragment 가 포함된 Activity의 2번 Fragment에 onActivityResult()를 전달하려면 어쩔까?
방법은 생각외로 간단하다. Fragment.startActivityForResult()를 사용하여 Activity를 실행하지 말고 Activity.startActivityForResult()를 사용하여 Activity를 실행하면 된다. Fragment 내부에서도
getActivity().startActivityForResult(new Intent..., REQUEST_CODE_BLAR_BLAR);
위와 같은 방식으로 1번 Fragment 의 부모 Activity의 메소드를 빌어 2번 Activity를 실행하면 된다.
그럼 당연히 결과는 1번 Activity의 Activity.onActivityResult() 메소드로 전달될 것이고, 우리는 필요에 따라서 2번 Fragment나 1번(부모) Activity 에서 적절히 사용하면 된다.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { DLog.d(TAG, "onActivityResult()"); super.onActivityResult(requestCode, resultCode, data); Fragment fragment = getFragmentManager().findFragmentByTag(FragmentTag.FRAGMENT_TAG_HISTORY); if (fragment != null) { ((FragmentHistory) fragment).onActivityResult(requestCode, resultCode, data); } }
요런식으로 내가 전달하고 싶은 Fragment를 찾아서 해당 Fragment의 onActivityResult에 이벤트를 전달하면 된다.
주의할 점이라면 Fragment.startActivityForResult() 와 Activity.startActivityForResult() 가 모두 존재한다는 것이다. 끝