Android

[Android] 프래그먼트 (Fragment)

도우 2024. 2. 12. 14:19
반응형

프래그먼트 (Fragment)

FragmentActivity 내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 결합하여 창이 여러개인 UI를 빌드할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다. 이는 자체적인 수명 주기를 가지고, 자체 입력 이벤트를 수신하고, 액티비티 실행 중에 추가 및 삭제가 가능하다.

다른 액티비티에 재사용할 수 있는 “하위 액티비티”와 같은 개념

주요 특징

  1. 수명 주기
    프래그먼트는 자체적인 생명 주기를 가지며, 이는 호스트 액티비티의 생명 주기에 직접적으로 영향을 받는다. 액티비티가 일시 정지되거나 소멸될 때 프래그먼트도 동일한 상태 변화를 겪는다.

    ex) 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 소멸된다.

  2. 독립성
    프래그먼트는 자체적인 입력 이벤트를 처리하고, 자신만의 레이아웃을 정의할 수 있습니다. 이를 통해 독립적인 모듈로서의 기능을 할 수 있습니다.

  3. 재사용성
    하나의 프래그먼트를 여러 액티비티에서 재사용함으로써 코드의 중복을 줄이고, 애플리케이션의 유지보수성을 향상시킬 수 있다.

  4. 동적인 UI 관리
    액티비티가 실행되는 동안 프래그먼트를 동적으로 추가하거나 제거할 수 있으며, 이러한 변경 사항을 백 스택에 기록하여 사용자가 뒤로 가기 버튼을 통해 이전 상태로 돌아갈 수 있도록 할 수 있다.

  5. 프래그먼트 간 통신
    프래그먼트는 인터페이스나 콜백 메커니즘을 사용하여 액티비티나 다른 프래그먼트와 통신할 수 있습니다. 이를 통해 사용자 인터페이스 내에서의 상호작용이나 데이터 교환을 용이하게 한다.

 

 

프래그먼트 관리 ( 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

 

1.프래그먼트와 프래그먼트의 호스트 활동 간 관계를 보여주는 UI 레이아웃의 두 가지 예

 

2.하위 프래그먼트를 관리하는 자체 FragmentManager가 연결되어 있는 각 호스트

 

출처 : http://sunphiz.me/wp/archives/2395

 

액티비티는 SupportFragmentManager를 사용하여 최상위 레벨에서 프래그먼트를 관리한다.

⇒ 이를 통해 액티비티는 여러 프래그먼트를 추가, 제거, 교체할 수 있으며 프래그먼트간의 탐색을 관리한다.

프래그먼트는 자식 프래그먼트를 관리하기 위해 ChildFragmentManager를 사용한다. 이는 중첩된 프래그먼트 구조를 가능하게 하며, 프래그먼트 내부에서 독립적인 탐색이나 뷰페이저를 구현할 때 유용하다.

프래그먼트가 다른 프래그먼트를 호스팅 하는 경우, 자식 프래그먼트는 ParentFragmentManager를 사용하여 상위 컨텍스트와의 상호작용을 관리할 수 있다.

하위 프래그먼트 관리자를 사용하는 주된 이유는 프래그먼트 내부에서 독립적인 프래그먼트 트랜잭션을 관리하기 위함이다. 이를 통해 중첩된 프래그먼트 구조를 구현할 수 있으며 인터페이스를 더욱 모듈화 하고 유연하게 만들어준다.

 

 

반응형