본문 바로가기

Android/Basic

Fragment와 Fragment 생명주기Fragment란?

📚

Fragment는 FragmentActivity내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타낸다. Fragment는 자체적인 수명주기(Lifecycle)를 가지며 자체 입력 이벤트를 수신하고, 액티비티 실행 중에 추가 및 삭제가 가능하다.

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

 

Fragment를 사용하는 이유


  • 개발자가 뷰 계층에 복잡한 변경 내용을 관리하지 않아도 태블릿과 같은 큰 화면에서 역동적이고 유연한 UI디자인을 구현할 수 있다.
  • 액티비티의 레이아웃을 여러 Fragment로 나누면 런타임에서 액티비티의 외관을 수정할 수 있다.
  • 액티비티의 변경 내용을 액티비티가 관리하는 백 스택에 보존할 수 있다.
  • 하나의 Fragment를 여러 액티비티에 포함할 수 있다. 따라서 재사용성을 염두에 두고 디자인해야 하며, 하나의 프래그먼트를 다른 프래그먼트에 직접 조작하는 것인 삼가야한다. → 이 부분에 대한 예시는 공식문서의 디자인 철학에 설명되어있다.
  • Fragment의 조합을 여러가지 화면 크기에 맞춰 변경할 수 있다.

 

Fragment의 생명주기


Android developer 사이트에 설명되어 있는 프래그먼트 라이프사이클은 아래와 같다.

 

프래그먼트 라이프 사이클의 호출 순서는 다음과 같다.

먼저 액티비티의 onCreate()가 호출 된 후, 아래의 차례대로 호출된다.

onAttach() → onCreate() → onCreateView() → onActivityCreated() → onStart() → onResume() → onPause() → onStop() → onDestroyView() → onDestroy() → onDetach()

 

각 생명주기별 호출 함수 설명


1. onAttach()

  • 프래그먼트가 액티비티에 붙을 때 호출된다.
  • 인자로 Context가 주어진다.

 

2. onCreate()

  • 프래그먼트가 액티비티의 호출을 받아 생성된다.
  • Bundle로 액티비티로부터 데이터가 넘어온다.
  • UI 초기화는 불가능하다.

 

3. onCreateView()

  • 레이아웃 inflate를 담당한다.
  • savedInstanceState로 이전 상태에 대한 데이터를 제공한다.
  • View와 관련된 객체를 초기화할 수 있다.

 

4. onViewCreated()

  • onCreatedView()를 통해 반환된 View객체는 onViewCreated()의 파라미터로 전달된다.
  • 이 때, Lifecycle이 INITIALIZED 상태로 업데이트가 된다.
  • 때문에 View의 초기값 설정, LiveData 옵저빙, RecyclerView, ViewPager2에 사용될 Adapter 세팅은 이 메소드에서 해주는 것이 적절하다.

 

5. onViewStateRestored()

  • 저장해둔 모든 state값이 Fragment의 View의 계층구조에 복원되었을 때 호출된다.(ex- 체크박스 위젯이 현재 체크되어 있는지 여부)
  • View Lifecycle owner: INITIALIZED → CREATED 변경

6. onStart()

  • 사용자에게 보여질 수 있을 때 호출
  • Activity의 onStart() 시점과 유사
  • Fragement의 childFragmentManager을 통해 FragmentTransaction을 안전하게 수행할 수 있다.
  • View lifecycle owner : CREATED → STARTED로 변경된다.

 

7. onResume()

  • 사용자와 프래그먼트가 상호작용 할 수 있는 상태일 때 호출된다.
  • Fragment가 보이는 상태에서 모든 Animator와 Transition 효과가 종료되고, 프래그먼트와 사용자가 상호작용 할 수 있을 때 onResume Callback

 

8. onPause()

  • Fragment가 visible일 때, onPause()가 호출된다.
  • 이 때, Fragment와 View의 Lifecycle이 PAUSED가 아닌, STARTED가 된다.

 

9. onStop()

  • Fragment가 더 이상 화면에 보여지지 않게 되면 onStop() callback을 호출한다.
  • 부모 액티비티, 프래그먼트가 중단될 때, 상태가 저장될 때 호출된다.
  • View와 Lifecycle: STARTED → CREATED
  • API 28버전을 기점으로 onSaveInstanceState()함수와 onStop() 함수 호출 순서가 달라진다. 따라서 onStop()이 FragmentTransation을 안전하게 수행하는 마지막 지점이 된다.

 

10. onDestroyView()

  • 모든 exit animation, transaction이 완료되고 Fragment가 화면으로부터 벗어났을 경우 호출된다.
  • view와 Lifecycle: CREATED → DESTROYED
  • 가비지 컬렉터에 의해 수거될 수 있도록 Fragment View에 대한 모든 참조가 제거되어야한다.
  • getViewLifecycleOwnerLiveData()

 

11. onDestroy()

  • Fragment가 제거되거나, FragmentManager가 destory됐을 경우, onDestroy() Callback함수 호출.
  • Fragment Lifecycle의 끝을 알린다.

 

12. onDetach()

  • 프래그먼트가 액티비티로부터 해제되어질 때 호출된다.

 


Uploaded by

N2T