안드로이드 findFragmentByTag, findFragmentById정리

SSY·2022년 12월 14일
0

Fragment

목록 보기
2/2
post-thumbnail

목차
1. fragmentList
2. findFragmentByTag
3. findFragmentById

1. fragmentList

FragmentManager는 총 두 가지에 대한 정보를 저장한다. 하나는 Transaction에 대한 백스택, 또 하나는 프래그먼트 리스트들이다.

FragmentManager가 관리하는 것?
a. 트랜잭션에 대한 백스택
b. 프래그먼트 리스트

a. 트랜잭션에 대한 백스택

이에 대한 정보는 다음 포스팅을 참고하면 금방 이해할거라 생각한다.

b. 프래그먼트 리스트

이는 말 그대로 FragmentManager가 보유하고 있는 프래그먼트 리스트를 의미한다.

2. findFragmentByTag

이 함수는 액티비티에 선언되어 있는 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")

이제 위처럼 받아온 프래그먼트를 사용하면 된다.

3. findFragmentById

이녀석을 사용하는 방법엔 두 가지 경우가 있다.

2가지
1. xml내, FragmentView의 id를 참조하는 경우.
2. xml내, FrameLayoutView의 id를 참조하는 경우.

1. xml내, FragmentView의 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의 경우는 어떻게 할까?

2. xml내, FrameLayoutView의 id를 참조하는 경우.

<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)
profile
불가능보다 가능함에 몰입할 수 있는 개발자가 되기 위해 노력합니다.

0개의 댓글