본문 바로가기

Android/Tech

ParentFragmentManager, ChildFragmentManager

Unsplash, Leonard Von Bibra.

동기

간만에 Android View 를 활용해 개발하고 있습니다. Jetpack Compose 를 통해 UI 를 구현한 시간이 길다보니, Fragment 에 대한 지식이 가물가물한 상태입니다. 특정 Fragment 에서 다른 Fragment 를 표시하려는 과정에서, parentFragmentManager 와 childFragmentManager 사이에서 고민하게 되었는데, 이 과정에서 알게 된 것을 간략하게 기록해보고자 합니다.


FragmentManager

안드로이드 개발에서 Fragment 는 굉장히 자주 사용됩니다. UI 를 모듈화할 수 있는 것이 특징인데요. 이를 통해 여러 View 를 하나의 Fragment 로 구성하여, 또 하나의 거대한 View 처럼 활용할 수 있기도 합니다.

 

https://developer.android.com/guide/fragments

 

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 에 대한 지식을 학습하고 있어야 되겠습니다.