Fragment에서 작업을 추가, 삭제 또는 교체하고 백 스택에 추가하는 등의 작업을 실행하는 클래스
Activity에서 액세스
getSupportFragmentManager()
메서드를 통해 FragmentManager
를 사용할 수 있다. (Kotlin에서는 supportFragmentManager() 사용)
Fragment에서 액세스
Activity뿐만 아니라 Fragment도 하위 Fragment를 1개 이상 호스팅할 수 있다. 하위요소를 관리하는 FragmentManager
에는 getChildFragmentManager()
로, 호스트 FragmentManager
에 액세스할 땐 getParentFragmentManager()
를 사용한다.
ViewPager2
를 구현한 하위 Fragment 1개를 호스팅하고 있다.FragmentManager
의 관계는 아래와 같다FragmentManager
는 Fragment 백스택을 관리한다. 백스택이란 현재 실행하는 FragmentTransaction
의 상태를 기억하기 위해 만들어진 개념이다. Fragment를 추가/삭제하는 작업은 FragmentTransaction
이란 단위로 commit된다.
뒤로가기 버튼이나 FragmentManager.popBackStack()
을 호출하는 경우 최상위 FragmentTransaction
이 스택에서 사라진다.
FragmentTransaction
에서 addToBackStack()
을 호출하면 ex) 여러 개의 Fragment 추가,교체 등 많은 작업들이 1개의 FragmentTransaction
에 포함되고 popBackStack()
로 한 번에 취소할 수 있다.
기존 Fragment 찾기
findFragmentById()
를 이용해서 Fragment Container의 현재 참조하고 있는 Fragment를 가져올 수 있다. supportFragmentManager.commit {
replace<ExampleFragment>(R.id.fragment_container)
setReorderingAllowed(true)
addToBackStack(null)
}
...
val fragment: ExampleFragment =
supportFragmentManager.findFragmentById(R.id.fragment_container) as ExampleFragment
findFragmentByTag()
를 사용.layout 내에서 정의되거나 FragmentTransaction
내에서 add(), replace()할 때 android:tag
XML 속성을 사용해서 태그를 할당한다.supportFragmentManager.commit {
replace<ExampleFragment>(R.id.fragment_container, "tag")
setReorderingAllowed(true)
addToBackStack(null)
}
...
val fragment: ExampleFragment =
supportFragmentManager.findFragmentByTag("tag") as ExampleFragment
FragmentManager
를 사용해 FragmentTransaction
을 만들고 add()나 replace()를 한다.supportFragmentManager.commit {
replace<ExampleFragment>(R.id.fragment_container)
setReorderingAllowed(true)
addToBackStack("name") // name can be null
}
setReorderingAllowed(true)
는 Fragment 전환을 최적화시킨다. commit 시 해당 속성을 지정해주는게 좋다.
addToBackStack()
호출하면 FragmentTransaction
이 백스택에 commit된다. addToBackStack()
호출할 때 매개변수로 name을 지정하게 되면 popBackStack()
시 해당 name을 이용해 특정 Transaction으로 돌아갈 수 있다.
Fragment를 삭제할 때 addToBackStack()
을 호출하지 않으면 삭제된 Fragment는 commit시 없어지므로 다시 탐색할 수 없다. 만약에 삭제할 때addToBackStack()
을 호출했다면 Fragment는 STOPPED
상태에 머물렀다가 나중에 사용자가 뒤로 탐색했을 때 RESUMED
상태가 된다.
FragmentTransaction
내에서 기본 탐색 Fragment를 지정하려면 Transaction에서 setPrimaryNavigationFragment()
메서드를 호출해서 childFragmentManager
에 기본 컨트롤이 있어야하는 Fragment 인스턴스를 전달한다.