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 를 사용하기를 권장(강제) 합니다.
https://www.andreasschrade.com/android-native-fragment-or-support-fragment-or-androidx-fragment)
support버전의 Fragment 를 사용할 때는 activity를 FragmentActivity 를 사용해야하며, FragmentActivity. getSupportFragmentManager() 를 이용해 FragmentManager() 를 얻어야 한다.
(https://developer.android.com/reference/androidx/fragment/app/Fragment)
최근에는 기본 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
'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 |