안드로이드

[Android/Kotlin] FragmentTransaction 프래그먼트 트랜젝션

란서 2022. 2. 26. 15:27

최근 상위/하위 프래그먼트를 다루기 위해 Fragment에 관한 공부를 다시 하던 중 프래그먼트 매니저와 프래그먼트 트랜젝션에 관한 내용이 잘 기억이 나지않아 간단하게 다시 포스팅하고자 한다.

 

https://developer.android.com/guide/fragments/fragmentmanager?hl=ko 

 

프래그먼트 관리자  |  Android 개발자  |  Android Developers

프래그먼트 관리자 참고: Navigation 라이브러리를 사용하여 앱의 탐색을 관리하는 것이 좋습니다. 프레임워크는 프래그먼트, 백 스택, 프래그먼트 관리자 사용에 관한 권장사항을 따릅니다. Navigat

developer.android.com

 

안드로이드 프래그먼트 구조.

 

Host Activity

supportFragmentManager를 통해 하위 프래그먼트를 관리한다.

 

 

Host Fragment

parentFragmentManger를 통해 Host Acitivity의 FragmentManger에 연결이 가능하고,

 

childFragmentMagner를 통해 하위 프래그먼트를 관리한다.

 

Child Fragment(s)

parentFragmentManager를 통해 Host Fragment의 FragmentManager에 연결이 가능하다.

 

 

 

  • ktx-fragment라이브러리를 사용한다면 현재 객체 상황에 따라 supportFragmentManager, parentFragmentManager, childFragmentManager 를 바로바로 사용할 수 있다.


 

 

 

프래그먼트 트랜젝션 FragmentTransaction

 

프래그먼트 트랜젝션을 사용할 때는 예전에는 fragmentManager.beginTransaction() 이렇게 객체를 받아서 사용했지만,

지금은 

 

supprotFragmentManager.commit{ it (fragmentTransaction)
}

를 이용해 트랜젝션과 commit을 동시에 할 수 있다.

트랜젝션은 프래그먼트의 add,remove,replace를 처리할 수 있는데 간단하게 해당 함수들의 기능을 알아보자.

 

  • add<Fragment Class>(R.id.fragmentContainer, TAG)  = 프래그먼트를 프래그먼트 컨테이너에 추가하는 함수.

    같은 프래그먼트의 중복 추가도 얼마든지 가능하며 같은 컨테이너에 여러 개의 프래그먼트를 추가한다면 View위에 쌓인 형태로 하나의 프래그먼트만이 UI에 노출된다. (그래도 생성은 된 상태)

    String 타입의 TAG를 추가로 인자로 넘겨준다면, 추가한 프래그먼트의 별명을 설정해주는 역할을 한다. 이 후 프래그먼트 매니저로부터 해당 프래그먼트를 찾는데에 도움이 된다. 


  • remove<Fragment Class>(R.id.fragment_container, TAG) = 해당 프래그먼트를 프래그먼트 컨테이너에서 삭제하는 함수.

    해당 프래그먼트 삭제

  • replace(Fragment Class>(R.id.fragment_container, TAG) = 해당 프래그먼트만을 프래그먼트 컨테이너에 남겨두는 함수,

    해당 프래그먼트를 제외한 모든 프래그먼트는 프래그먼트 컨테이너에서 삭제한다.
    replace라는 이름 때문에 약간 해당 프래그먼트를 현재 컨테이너로 스윽 교체하는 기능이라고 생각하였지만, 만약 해당 프래그먼트가 현재 컨테이너에 추가되어 있지 않다면,, 효과가 무의미한 함수. 

    따라서 반드시 현재 프래그먼트에 해당 프래그먼트를 추가한 뒤 (또는 이미 있다고 확인될 때) 사용해줘야 효과가 있다.

    -03.08 수정

    replace함수를 이용하여 프래그먼트를 추가하는 동시에, 이외에 모든 프래그먼트는 삭제할 수 있음을 확인하였다.

    replace(container, Fragment, Tag) 이렇게 사용하면, (tag는 생략가능) 된다.


supportFragmentManager.commit {
    replace(R.id.frame_container, Fragment(),"TAG")
}