본문 바로가기

IT

Fragment 에서 startActivityForResult() 사용하여 onActivityResult() 로 이벤트 전달이 안되는 경우

반응형

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() 가 모두 존재한다는 것이다.

반응형