동기
간만에 Android View 를 활용해 개발하고 있습니다. Jetpack Compose 를 통해 UI 를 구현한 시간이 길다보니, Fragment 에 대한 지식이 가물가물한 상태입니다. 특정 Fragment 에서 다른 Fragment 를 표시하려는 과정에서, parentFragmentManager 와 childFragmentManager 사이에서 고민하게 되었는데, 이 과정에서 알게 된 것을 간략하게 기록해보고자 합니다.
FragmentManager
안드로이드 개발에서 Fragment 는 굉장히 자주 사용됩니다. UI 를 모듈화할 수 있는 것이 특징인데요. 이를 통해 여러 View 를 하나의 Fragment 로 구성하여, 또 하나의 거대한 View 처럼 활용할 수 있기도 합니다.
Fragment 는 특정 Activity 에 의존하게 됩니다. 의존하는 Fragment 를 관리하는 객체가 바로 FragmentManager 이고요. FragmentManager 는 Fragment 를 추가, 삭제 또는 교체하고, 이를 백 스택에 추가하는 등의 작업을 실행하는 클래스입니다. 관련된 내용은 아래에서 자세히 확인하실 수 있습니다.
프래그먼트 관리자 | Android 개발자 | Android Developers
프래그먼트 관리자 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: Navigation 라이브러리를 사용하여 앱의 탐색을 관리하는 것이 좋습니다. 프레임워크
developer.android.com
parentFragmentManager, childFragmentManager
Fragment 는 각자의 FragmentManager 를 갖고 있습니다. Fragment 의 구현을 들여다보면 확인할 수 있습니다.
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner,
ActivityResultCaller {
...
// Private fragment manager for child fragments inside of this one.
@NonNull
FragmentManager mChildFragmentManager = new FragmentManagerImpl();
...
}
childFragmentManager 의 child 는 Fragment 자기 자신을 의미하므로, 모든 Fragment 에서 childFragmentManager 를 참조하는 것은 자기 자신이 가진 FragmentManager 를 참조하는 것입니다.
즉, Fragment 는 항상 어떤 컨테이너의 하위 객체임을의미합니다.
parentFragmentManager 는 말 그대로 부모의 FragmentManager 를 불러옵니다. 그러므로, Activity 에서 직접 생성하여 추가한 Fragment 에서 parentFragmentManager 를 참조하면 Activity 의 FragmentManager 를 참조합니다.
// Activity
println("Activity FragmentManager : ${supportFragmentManager.hashCode()}")
// Fragment
println("Fragment ParentFragmentManager : ${parentFragmentManager.hashCode()}")
// Console
Activity FragmentManager : 88230150
Fragment parentFragmentManager : 88230150
Fragment 에 추가된 Fragment 에서 parentFragmentManager 를 참조하면, 상위 Fragment 의
childFragmentManager 를 참조하는 것과 같습니다.
이러한 계층 구조에서의 참조를 그림으로 표현하면 다음과 같습니다.
특정 Fragment 를 어떤 컨테이너에서 관리할지에 대한 고민이 완료되면, 적절한 FragmentManager 를 참조하면 되겠습니다.
Jetpack Compose 를 Fragment 와 함께 활용하는 경우도 꽤 많다고 들었습니다. 한 번도 그렇게 해 본 적은 없지만, 언젠가 그렇게 개발하게 될 수도 있으니, 여전히 Fragment 에 대한 지식을 학습하고 있어야 되겠습니다.
'Android > Tech' 카테고리의 다른 글
[Jetpack Compose] HiltViewModel() 을 통해 주입된 ViewModel 의 생애 알아보기 (2) | 2024.02.11 |
---|---|
OkHttp3 Interceptor 를 통해 표준화된 응답의 에러 처리하기 (0) | 2024.02.01 |
Composable 파라미터 주의 사항 (feat.Recomposition) (0) | 2024.01.17 |
Service 를 운용하는 환경에서 앱을 완전히 종료하기 (2) | 2024.01.06 |
AsyncTask 는 왜 Deprecated 되었는가? (0) | 2024.01.03 |