Fragment 에서 activity 호출 후 호출된 Activity 종료 시 작업 결과 DATA 를 리턴받고 싶을 때가 있습니다.
이 때 아래와 같이 하면 리턴을 받을 수 있습니다.
1. Fragment를 포함하는 Activity 에 FragmentActivity 를 상속
2. Fragment 에 onActivityResult 를 오버라이딩하여 구현
3. Fragment 에 startActivityForResult() 메소드를 호출
4. Fragment 에 의해 실행된 Activity 에서 setReslut 후에 finish
5. Fragment 의 onActvityResult 가 실행됨.
일단, onActivityResult 는 Fragment 를 포함하고 있는 Activity 부터 먼저 호출됩니다.
그리고, 아래 로직에 따라 Fragment 로 전달됩니다.
아래는 FragmentActivity 의 onActivityResult 입니다.

Fragment 에서 startActivityForResult 를 하면 Fragment를 가지고 있는 onActivityResult 의 requestCode 가 0xffff(65535) 이상으로 전달됩니다.
그래서, >> 16 연산을 했을 때 0이 아니면 Fragment 에서 startActivityForResult 를 한 것으로 판단하고, Fragment 에 DATA 를 전달하기 위해서 findFragmentByWho 로 Fragment 검색 후 그 Fragment 의 onActivityResult를 호출합니다.
호출한 Fragment 가 없을 경우는 바로 return 됩니다.
쉬프트연산(>>) 16 연산을 했을 때 0인 경우는 0xffff 보다 작은 경우로 Activity 에서 startActivityForResult 를 호출 한 것으로 판단하고 일반적인 경우 형태로 실행하기 위해서 super.onActivityResult 를 호출합니다.
그리고, Fragment 를 포함하는 Activity 에서 onActivityResult 를 오버라이딩 하는 경우에는 꼭 super.onActivityResult를 호출하여 위 이미지 소스코드인 FragmentActivity 의 onActivityResult가 호출되도록 해야지 Fragment에서 DATA 를 받을 수 있습니다.
따라서, Framgment 가 아니라 Fragment 를 포함하는 Activity의 onActivityResult 에서 DATA를 받아 처리를 하고 싶다면 Framgent 의 startActivityForResult 가 아니라 getActivity().startActivityForResult() 를 호출해서 Activity의 startActivityForResult() 가 호출되도록 해주어야 합니다.
FragmentActivity 가 아닌 andorid.app.Acivity 를 상속받는 경우는 어떻게 될까요?
Fragment의 onActivityResult 는 당연히 동작하지 않는다. 직접 Acitivity 또는 Fragment 에서 온 것인지, 어디서 왔는 지 확인 하는 등의 로직등을 구현해주어야 합니다.
이러한 이유뿐만 아니라 호환성유지를 위해서 Android.app,fragment 보다는 androidx 패키지의 Fragment 를 사용하기를 권장(강제) 합니다.
Difference between android.app.Fragment and android.support.v4.app.Fragment
What is the difference between android.app.Fragment and android.support.v4.app.Fragment, and what are the circumstances in which each should be used?
stackoverflow.com
https://www.andreasschrade.com/android-native-fragment-or-support-fragment-or-androidx-fragment)
Native Fragment vs. Support Fragment vs. Androidx Fragment
or… Fragment vs. Fragment vs. Fragment Someone who is new in the field of Android development might wonder… What is the difference between all these different Fragment implementations??? First of all, what kind of Fragment implementations do exist? Lib
www.andreasschrade.com
support버전의 Fragment 를 사용할 때는 activity를 FragmentActivity 를 사용해야하며, FragmentActivity. getSupportFragmentManager() 를 이용해 FragmentManager() 를 얻어야 한다.
(https://developer.android.com/reference/androidx/fragment/app/Fragment)
Fragment | Android 개발자 | Android Developers
Fragment public class Fragment extends Object implements ComponentCallbacks, View.OnCreateContextMenuListener, LifecycleOwner, ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner, ActivityResultCaller java.lang.Object ↳
developer.android.com
최근에는 기본 startActivityForResult() 및 onActivityResult() API는 모든 API 수준의 Activity 클래스에서 사용할 수 있지만 AndroidX Activity 1.2.0-alpha02 와 프래그먼트 1.3.0-alpha02에서 도입된 Activity Result API를 사용하는 것이 더 좋다고 합니다.
https://developer.android.com/training/basics/intents/result#java
활동으로부터 결과 가져오기 | Android 개발자 | Android Developers
개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어 앱에서 카메라 앱��
developer.android.com
'Tech & Programming > 모바일(Android, Flutter)' 카테고리의 다른 글
Android Context (0) | 2020.11.13 |
---|---|
안드로이드 11 대응(Target SDK 30) - Scoped storage (4) | 2020.10.29 |
org.apache.commons.io 라이브러리에서 java.lang.NoSuchMethodError 에러 해결 (0) | 2019.11.14 |
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() 오류 해결 (0) | 2019.10.01 |
안드로이드 가로/세로모드 고정하는 방법 (0) | 2019.09.13 |