본문 바로가기
Native App/👽Android

Fragment

by yewoneeee 2024. 8. 24.

Fragment

Fragment(프래그먼트)는 앱 UI의 재사용 가능한 부분을 나타냄.

  • 자체 레이아웃을 정의 및 관리
  • 자체 라이프사이클(생명주기)를 보유
  • 자체 입력 이벤트를 처리 가능
  • 단, 단독으로 실행 불가하기 때문에 액티비티 또는 다른 프래그먼트에서 호스팅해야 함

 

모듈성

프래그먼트는 UI를 개별 청크로 분할할 수 있도록 하여 액티비티의 UI에 모듈성과 재사용성을 제공함.

즉, 액티비티엔 Navigation 창과 같은 전역 요소를 배치하고, 프래그먼트는 단일 화면이나 화면의 일부의 UI를 정의하고 관리하는 역할

 

프래그먼트를 사용하면 런타임 시 액티비티의 모양을 더 쉽게 수정할 수 있음

액티비티가 생명주기 STARTED 이상의 상태에 있는 동안 프래그먼트를 추가, 교체, 삭제할 수 있음

이런 변경 사항을 백스택에 보관할 수 있으므로 변경사항을 취소할 수 있음

 

 

Fragment Manager

Fragment Manager는 프래그먼트 백스택을 관리하는 역할로
런타임 시 사용자 상호작용에 응답해 프래그먼트를 추가, 삭제, 교체, 백스택에 추가하는 등 작업을 실행하는 클래스

 

1. FragmentManager에 액세스

  • 액티비티나 프래그먼트에서 Fragment Manager에 액세스 가능
  • FragmentActivity나 AppCompatActivity는 supportFragmentManager프로퍼티를 통해 액세스 가능
  • 현재 프래그먼트의 하위 요소를 관리하는 FragmentManager에 액세스하려면 childFragmentManager 사용
  • 현재 프래그먼트를 호스팅하는 부모 FragmentManager에 액세스해야 한다면 parentFragmentManager 사용

2. FragmentManager 사용 방법

  • 프래그먼트의 추가, 삭제, 교체 등의 변경사항은 FragmentTransaction이라는 단일 단위로 함께 커밋됨
  • FragmentManager를 사용해서 FragmentTransaction을 생성
  • add(), replace(), remove() 등의 메서드를 사용해서 각 트랜잭션을 실행할 수 있음
  • 트랜잭션은 commit(), commitNow() 등의 메서드를 호출해서 실행해야 함
- commit()
비동기적으로 커밋하기 때문에 트랜잭션이 즉시 실행되지는 않음
대신 트랜잭션이 가능한 빨리 기본 UI 스레드에서 실행되도록 예약됨
- commitNow()
트랜잭션을 즉시 커밋 UI 스레드에서 프래그먼트 트랜잭션을 즉시 실행할 수 있음
단, addBackStack과는 호환되지 않아 백스택에 추가할 수 없음

대부분 commit만 사용

 

3. 사용 예시

supportFragmentManager.commit {
   replace<ExampleFragment>(R.id.fragment_container) // 프래그먼트 교체
   setReorderingAllowed(true) // 성능 개선을 위해 트랜잭션 내 최적화 및 재정렬을 허용하는 옵션
   addToBackStack("name") // 트랜잭션이 백스택에 저장되어 뒤로가기 버튼을 눌렀을 때 이전 상태로 돌아갈 수 있음
}

 

 

Fragment 생명주기

프래그먼트는 두 가지 주요 생명주기를 가짐

1. 프래그먼트 자체의 생명주기

2. 그 내부에 있는 뷰의 생명주기

 

1. Fragment Lifecycle

액티비티의 생명주기와 유사하지만, 프래그먼트는 액티비티에 종속적임

프래그먼트 생명주기는 아래와 같은 주요 콜백 메서드들로 구성됨

  • onAttach()
    • 프래그먼트가 액티비티에 처음 붙여질 때 호출
    • 이 시점에서 액티비티 context에 액세스 가능
  • onCreate()
    • 프래그먼트가 생성될 때 호출
    • onAttach() 이후 호출되며 UI는 아직 생성되지 않음
    • 여기서 데이터 초기화나 프래그먼트가 유지해야할 상태를 처리할 수 있음
  • onCreateView()
    • 프래그먼트의 UI를 생성할 때 호출
    • 레이아웃을 inflate하여 프래그먼트의 뷰 계층 구조를 만듦
    • 이 메서드에서 레이아웃을 반환함
  • onViewCreated()
    • 뷰가 생성된 후 호출
    • 뷰를 설정하거나, 데이터를 바인딩하는 로직을 처리할 수 있음
  • onStart()
    • 프래그먼트가 화면에 보이기 시작할 때 호출
  • onResume()
    • 프래그먼트가 사용자와 상호작용할 준비가 되었을 때 호출
    • 액티비티가 onResume() 상태일 때만 프래그먼트도 이 메서드를 호출함
    • 이 시점에서 프래그먼트는 활성화 상태
  • onPause()
    • 프래그먼트가 중단되기 직전에 호출
    • 다른 프래그먼트나 액티비티로 전환될 때 호출
  • onStop()
    • 프래그먼트가 더 이상 화면에 보이지 않게 될 때 호출
  • onDestroyView()
    • 프래그먼트의 뷰가 파괴될 때 호출
    • 이 시점에서 뷰와 관련된 리소스를 해제해야 함
  • onDestroy()
    • 프래그먼트가 완전히 파괴되기 전에 호출
    • 마지막 정리 작업 처리
  • onDetach()
    • 프래그먼트가 액티비티에서 분리될 때 호출

 

 

2. View Lifecycle(Fragment View의 생명주기)

프래그먼트 자체의 생명주기와는 별도로 관리됨

onCreateView()에서 생성되고, onDestroyView()에서 파괴됨

즉, 뷰가 생성된 후 뷰와 관련된 작업을 수행하고 뷰가 파괴될 때 리소스를 해제해야 함

뷰 생명주기 내에서 뷰를 초기화하거나 바인딩할 때, onViewCreated() 사용하고 뷰가 파괴될 때 관련 리소스를 해제

  • onCreateView()
    • 뷰가 생성
  • onViewCreated()
    • 뷰가 완전히 생성
    • 초기화 작업을 수행할 수 있음
  • onDestroyView()
    • 뷰가 파괴될 때 호출
    • 여기서 뷰 바인딩 해제 등의 작업을 처리함

 

한 눈에 사진으로 보기

 

Activity와의 차이점

  • 모듈성
    • 프래그먼트는 보다 모듈화되고 재사용이 가능하며, 여러 액티비티에서 나타나는 UI 구성요소를 표현하기에 이상적임
  • 생명주기
    • 액티비티는 여러 프래그먼트를 호스트할 수 있으며, 독립적인 존재
    • 프래그먼트는 자신이 속한 액티비티에 의존적임
  • UI 디자인의 유연성
    • 프래그먼트는 복잡한 디자인에 더 많은 유연성을 제공
    • 여러 프래그먼트를 한 화면에 동시에 표시할 수 있음
  • 백스택 관리
    • 액티비티는 자동적으로 Stack에 넣어지고, Fragment는 Transaction을 통해서 요청해야 함

 

참고


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

 

프래그먼트  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 프래그먼트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Fragment는 앱 UI의 재사용 가능한 부분을 나

developer.android.com

 

https://velog.io/@asdsad8664/Activity-%EC%99%80-Fragment%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

Activity 와 Fragment의 차이

Android Activity 와 Fragment의 차이점정의 : 안드로이드에서 액티비티는 사용자 인터페이스를 가진 단일 화면으로 작동합니다. 앱의 내용이 표시되는 프레임 또는 창과 같습니다. 각 액티비티는 독립

velog.io

 

'Native App > 👽Android' 카테고리의 다른 글

안드로이드 네트워크 통신 라이브러리 Retrofit, OkHttp  (2) 2024.08.12
Intent란  (0) 2024.08.05
Context란  (0) 2024.07.29
Kotlin을 사용하는 이유  (0) 2024.07.26
Android 4대 컴포넌트  (0) 2024.07.26

댓글