목차
1. fragmentList
2. findFragmentByTag
3. findFragmentById
FragmentManager는 총 두 가지에 대한 정보를 저장한다. 하나는 Transaction에 대한 백스택, 또 하나는 프래그먼트 리스트들이다.
FragmentManager가 관리하는 것?
a. 트랜잭션에 대한 백스택
b. 프래그먼트 리스트
이에 대한 정보는 다음 포스팅을 참고하면 금방 이해할거라 생각한다.
이는 말 그대로 FragmentManager가 보유하고 있는 프래그먼트 리스트를 의미한다.
이 함수는 액티비티에 선언되어 있는 contrainerView가 비어 있을 때 처음 실행하는 오퍼레이션(add, replace)에 태그를 지정하는걸로 시작한다. ('a'라는 태그를 지정했다)
supportFragmentManager.beginTransaction()
.add(contrainerId, Fragment_A(), "a")
.commit
// 또는
supportFragmentManager.beginTransaction()
.replace(contrainerId, Fragment_A(), "a")
.commit
이제 FragmentManager에선 '프래그먼트 리스트' 내부에 Fragment_A를 추가하게 된다. 그리고 이렇게 추가된 프래그먼트를 findFragmentByTag를 통해 불러올 수 있는 것이다.
val fragmentA: Fragment = supportFragmentManager.findFragmentByTag("a")
이제 위처럼 받아온 프래그먼트를 사용하면 된다.
이녀석을 사용하는 방법엔 두 가지 경우가 있다.
2가지
1. xml내, FragmentView의 id를 참조하는 경우.
2. xml내, FrameLayoutView의 id를 참조하는 경우.
<fragment
android:id="@+id/mainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.Fragment_A" />
위 프래그먼트를 아래와 같이 조회할 수 있다.
val currentFragment: Fragment = supportFragmentManager.findFragmentById(R.id.mainFragment)
하지만, 시시각각 변하는 Activity내의 containerView의 경우는 어떻게 할까?
<FrameLayout
android:id="@+id/mainContainer"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
위 containerView에 attach될 수 있는 프래그먼트가 총 4가지라고 가정해보자.
ㄴ> (Fragment_A, Fragment_B, Fragment_C, Fragment_D)
이렇게 말이다. 그리고 하단에는 4가지의 탭이 있고, 그 탭을 누를때마다 위 프래그먼트들이 번갈아가며 나타난다. 다음과 같이 말이다.
B탭을 누르면 Fragment_B가 나타나는 그런식이다.
위의 경우는 첫 번째 경우처럼 fragmentView를 직접 선언해주지 않았다.
하지만 현재 보이는 뷰를 가져오고 싶다면?
그럴 경우는 그냥 아래와 같은 코드를 작성해주면 현재 onResume되어 있는 프래그먼트를 얻어올 수 있다.
val currentFragment: Fragment = supportFragmentManager.findFragmentById(R.id.mainContainer)