💡FragmentManager & FragmentTransaction의 역할을 이해하고 활용하는 방법에 대하여 기록하였습니다.
FragmentManager
프래그먼트 관리자 | Android Developers
- FragmentManager는 앱 프래그먼트에서 프래그먼트를 추가, 삭제, 교체하고 백 스택에 추가하는 작업을 실행하는 클래스입니다.
- Activity or Fragment에서 액세스 할 수 있으며, FragmentActivity 및 서브 클래스에서 접근이 가능합니다.
- getSupportFragmentManager() 메서드로 FragmentManager에 엑세스 가능합니다.
주요 역할
- Fragment 추가, 제거, 교체
- BackStack 관리
- FragmentTransaction
FragmentTransaction
- FragmentManager를 사용하여 Fragment를 추가, 제거, 교체 등의 작업을 수행하는 일련의 과정을 의미합니다.
- 데이터베이스에서와 같이 일련의 작업들을 묶어 처리하는 개념으로 Fragment 관련 작업을 한 번에 처리하고 성공적으로 완료되면 commit할 수 있습니다.
FragmentTransaction | Android Developers
- FragmentTransaction 객체를 사용해서 Fragment Transaction Method 작업을 진행할 수 있으며, 여러 작업을 한번에 묶어 트랜잭션 단위로 처리할 수 있습니다.
- 또한 FragmentTransaction은 BackStack에 추가할 수 있어, 사용자가 뒤로 가기 버튼을 눌렀을 때 이전 상태로 돌아갈 수 있습니다.
Fragment Transaction Method
- add() : 새로운 Fragment 추가
- replace() : 기존의 Fragment 교체
- remove() : Fragment 제거
- hide() : Fragment를 화면에서 숨김
- show() : 숨겨진 Fragment 표시
- attach() : Fragment를 다시 화면에 표시
- detach() : Fragment를 화면에서 분리
BackStack 관리
- BackStack은 Fragment 트랜잭션을 기록하여, 사용자가 뒤로 버튼을 눌렀을 때 이전 상태로 돌아갈 수 있게 하는 기능입니다.
- addToBackStack() 메서드를 호출하여 트랜잭션을 BackStack에 추가할 수 있습니다.
fragmentTransaction.replace(R.id.fragment_container, newFragment)
fragmentTransaction.addToBackStack(null) // 트랜잭션을 BackStack에 추가
fragmentTransaction.commit()
- Fragment 트랜잭션에 아래와 같이 애니메이션을 추가하여 전환 효과를 줄 수 있습니다.
fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left)
주의점
- 상태 손실 방지
- commit()은 UI 스레드에서만 호출해야 하며, 액티비티가 일시적으로 중단된 상태에서 호출하면 IllegalStateException이 발생할 수 있습니다.
- 이러한 경우 commitAllowingStateLoss()를 사용할 수 있지만, 상태 손실이 발생할 수 있으니 신중하게 사용해야 합니다.
- UI 스레드에서만 실행
- UI가 아닌 스레드에서 Fragment 트랜잭션을 실행하면 앱 충돌이 발생할 수 있습니다.
supportFragmentManager
- FragmentManager의 인스턴스로 Activity에 직접 추가되는 Fragment들을 관리합니다.
- Activity에서 Fragment를 추가, 교체, 제거할 때 사용합니다.
- FragmentTranscation을 관리하며 BackStack을 통해 뒤로 가기 동작 등을 처리할 수 있습니다.
childFragmentManager
- Fragment 내에서 또 다른 Fragment를 관리할 때 사용되는 FragmentManager입니다.
- Fragment 내에 자식 Fragment를 추가하거나 관리해야 할 때 사용합니다.
- Nested Fragment(중첩 프래그먼트), ViewPager2, 탭 레이아웃, 다중 레이아웃을 가진 Fragment에서 자식 Fragment를 관리할 때 사용됩니다.
정리
- FragmentManager는 Android에서 Fragment의 라이프사이클을 관리하고 트랜잭션을 처리하는 도구입니다.
- Fragment 트랜잭션은 FragmentManager를 사용하여 Fragment를 동적으로 추가, 제거, 교체하는 작업을 트랜잭션 단위로 처리하는 방식입니다.
- 이들을 통해 UI 전환을 더 유연하게 관리할 수 있으며, BackStack을 사용하면 이전 상태로 돌아가는 동작을 지원할 수 있습니다.