프래그먼트 (Fragment)
FragmentActivity 내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 결합하여 창이 여러개인 UI를 빌드할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다. 이는 자체적인 수명 주기를 가지고, 자체 입력 이벤트를 수신하고, 액티비티 실행 중에 추가 및 삭제가 가능하다.
⇒ 다른 액티비티에 재사용할 수 있는 “하위 액티비티”와 같은 개념
주요 특징
- 수명 주기
프래그먼트는 자체적인 생명 주기를 가지며, 이는 호스트 액티비티의 생명 주기에 직접적으로 영향을 받는다. 액티비티가 일시 정지되거나 소멸될 때 프래그먼트도 동일한 상태 변화를 겪는다.
ex) 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 소멸된다. - 독립성
프래그먼트는 자체적인 입력 이벤트를 처리하고, 자신만의 레이아웃을 정의할 수 있습니다. 이를 통해 독립적인 모듈로서의 기능을 할 수 있습니다. - 재사용성
하나의 프래그먼트를 여러 액티비티에서 재사용함으로써 코드의 중복을 줄이고, 애플리케이션의 유지보수성을 향상시킬 수 있다. - 동적인 UI 관리
액티비티가 실행되는 동안 프래그먼트를 동적으로 추가하거나 제거할 수 있으며, 이러한 변경 사항을 백 스택에 기록하여 사용자가 뒤로 가기 버튼을 통해 이전 상태로 돌아갈 수 있도록 할 수 있다. - 프래그먼트 간 통신
프래그먼트는 인터페이스나 콜백 메커니즘을 사용하여 액티비티나 다른 프래그먼트와 통신할 수 있습니다. 이를 통해 사용자 인터페이스 내에서의 상호작용이나 데이터 교환을 용이하게 한다.
프래그먼트 관리 ( FragmentManager )
Android 애플리케이션 내에서 프래그먼트의 추카, 제거 및 교체와 같은 트랜잭션을 관리하고, 프래그먼트를 액티비티에 추가하는 방법을 제공한다. 프래그먼트의 생명 주기를 관리하고, 프래그먼트 간의 통신을 촉진한다.
- 프래그먼트 찾기
findFragmentById(R.id.fragment_container)
findFragmentByTag(”fragment_tag”) - 프래그먼트 트랜잭션
FragmentManager를 사용하여 FragmentTransaction 객체를 생성할 수 있으며, 이를 통해 프래그먼트를 추가, 제거, 교체하거나 백 스택에 추가하는 등의 작업을 수행할 수 있다. 트랜잭션을 시작하려면 beginTransaction() 메소드를 호출한 다음, 필요한 트랜잭션 작업을 체이닝 방식으로 연결하고, 마지막으로 commit()을 호출하여 변경 사항을 적용한다. - 백 스택 관리
사용자가 뒤로 가기 버튼을 눌렀을 때 이전 프래그먼트 상태로 돌아갈 수 있도록 프래그먼트 트랜잭션을 백 스택에 추가할 수 있다. addToBackStack(null) 메서드를 사용하여 트랜잭션을 백 스택에 추가할 수 있으며, popBackStack()을 호출하여 프로그래매틱하게 백 스택을 뒤로 넘길 수 있다. - 리스너 등록
addOnBackStackChangedListener()를 사용하여 백 스택 변경 사항을 듣는 리스너를 등록할 수 있다. 이를 통해 애플리케이션에서 백 스택의 변경 사항에 따라 UI를 업데이트하거나 다른 작업을 수행할 수 있다.
프래그먼트 수명 주기 처리
프래그먼트의 수명 주기는 액티비티의 수명 주기와 매우 유사하며, 액티비티 내에서 독립적인 모듈로서 기능한다. 프래그먼트는 다음과 같은 3가지의 상태로 존재할 수 있다.
- 재개됨(Resumed)
- 일시정지됨(Paused)
- 정지됨(Stopped)
프래그먼트는 액티비티와 마찬가지로 onSaveInstanceState, ViewModel, 영구 로컬 저장소 등을 사용하여 프래그먼트의 UI 상태를 보존할 수 있다. 이를 통해 구성 변경이나 프로세스 종료 후에도 상태를 유지할 수 있다.
활동 수명 주기와의 차이점
< 백 스택 >
액티비티
정지되면 시스템에서 관리하는 액티비티의 백 스택에 들어간다.
=> 사용자는 Back 버튼을 눌러서 액티비티로 돌아갈 수 있다
프래그먼트
addToBackStack()을 호출
⇒ 인스턴스를 저장하라고 명시적으로 요청할 경우에만 백 스택으로 들어간다.
액티비티 수명 주기와의 조화
프래그먼트는 액티비티의 수명 주기 상태 변화에 따라 관련 콜백을 받는다.
⇒ 액티비티가 onPause()를 받으면 , 해당 액티비티 내의 각 프래그먼트가 onPause()를 받는다.
프래그먼트는 액티비티와 상호 작용하기 위한 고유 수명 주기 콜백이 존재한다.
onAttach() : 프래그먼트가 액티비티와 연결되어 있었던 경우 호출된다.
onCreateView() : 프래그먼트와 연결된 뷰 계층을 생성하기 위해 호출된다.
onActivityCreated() : 액티비티의 onCreate() 메서드가 반환될 때 호출된다.
onDestroyView() : 프래그먼트와 연결된 뷰 계층이 제거되는 중일 때 호출된다.
onDetach() : 프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출된다.
ParentFragmentManager 와 ChildFragmentManager
액티비티는 SupportFragmentManager를 사용하여 최상위 레벨에서 프래그먼트를 관리한다.
⇒ 이를 통해 액티비티는 여러 프래그먼트를 추가, 제거, 교체할 수 있으며 프래그먼트간의 탐색을 관리한다.
프래그먼트는 자식 프래그먼트를 관리하기 위해 ChildFragmentManager를 사용한다. 이는 중첩된 프래그먼트 구조를 가능하게 하며, 프래그먼트 내부에서 독립적인 탐색이나 뷰페이저를 구현할 때 유용하다.
프래그먼트가 다른 프래그먼트를 호스팅 하는 경우, 자식 프래그먼트는 ParentFragmentManager를 사용하여 상위 컨텍스트와의 상호작용을 관리할 수 있다.
하위 프래그먼트 관리자를 사용하는 주된 이유는 프래그먼트 내부에서 독립적인 프래그먼트 트랜잭션을 관리하기 위함이다. 이를 통해 중첩된 프래그먼트 구조를 구현할 수 있으며 인터페이스를 더욱 모듈화 하고 유연하게 만들어준다.
'Android' 카테고리의 다른 글
[Android] RecyclerView (1) - 개념 및 구조 (0) | 2024.02.14 |
---|---|
[Android] SearchView 대신에 EditText 사용하기 (1) | 2024.02.13 |
[Android] 활동(Activity)의 개념 (1) | 2024.02.08 |
[Android] TabLayout에 ViewPager2 사용하기 (1) | 2024.02.07 |
[Android] TabLayout 만들기 (1) | 2024.02.07 |