Fragment

똘이주인·2021년 7월 12일
0
  1. 개발자가 다른 크기의 화면에서 개발할 때, view구조를 수정하지 않고 쉽게 재사용 할 수 있다
  2. 액티비티를 여러 모듈로 나눔으로써 액티비티는 런타임동안 레이아웃을 유동적으로 바꿀 수 있고, 백버튼과 쉽게 연동할 수 있다.
  3. 각 프래그먼트는 독립적으로 사용자 입력을 받고, 개별 라이프사이클을 가지므로, UX를 최적화할 수 있다.

Activity "안"에서 UI 나 프로세스를 정의할 수 있는 더 작은 단위

Fragment 특징

  1. Activity와 세트메뉴로 동작하며, 재사용 가능하다.
    즉, 반드시 Activity가 있어야 한다. 혼자 둥둥 떠다니며 존재할 수 없다.
    - 하나의 Activity 안에 여러개의 Fragment 가 존재할 수 있다.

        방법 1 : 위의 그림 왼쪽 처럼 태블릿의 한 activity에 fragment 두개를 나타낼 수 있다.
        방법 2 : 스마트폰의 하나의 액티비티 위에서 여러개의 fragment를 왔다갔다 하며 사용할 수 있다
    
    - 여러개의 Activity 에서 하나의 Fragment 를 재사용 할 수 있다. 단, 이 또한 레이아웃이 같다면 가능
  2. Fragment만의 생명주기를 가진다. 단, activity의 생명주기와 연관성(의존관계)이 있다.

아래 그림은 activity의 각 상태가 성공적으로 전이되었을 때, fragment가 호출 받을 수 있는 콜백함수 범위이다.

1. onAttach()

프래그먼트가 액티비티에 붙을 때 호출된다. 하지만 아직 완벽하게 생성된 것은 아님

(잘 생각해보면, 프래그먼트는 액티비티 없인 독단적으로 존재할 수없는 존재란 소리다.)

2. onCreate()

본격적으로 프래그먼트가 액티비티에 호출을 받아 생성되는 시점이다.

액티비티의 onCreate()에선 view나 ui관련 작업을 할 수 있으나, 프래그먼트의 onCreate()에서는 할 수 없다.

대신 다음에 호출될 onCreateView()에서 ui관련 작업을 할 수있다.

3. onCreateView()

프래그먼트에 속한 각종 view나 viewGroup에 대한 ui 바인딩 작업을 할 수있다.

(Layout을 inflater하여 View작업을 한다.)

4. onActivityCreated()

액티비티에서 프래그먼트를 모두 생성하고 난 다음에 호출된다. 즉 액티비티에서 onCreate()다음에 호출되는 녀석이다.

액티비티와 프래그먼트가 드디어 연결되는 시점이다.

5. onStart()

프래그먼트가 사용자에게 보여지기 전에 호출되는 함수 - 액티비티와 같음

6. onResume()

프래그먼트가 비로소 화면에 보여지는 단계, 사용자에게 포커스를 잡은 상태, 사용자와의 상호작용이 가능!!

-------- 다른 프래그먼트가 치고 들어오는 경우 (add되는 경우) --------

7. onPause()

프래그먼트는 사용자와의 상호작용을 중지한다.

다시 돌아온다는 보장이 없으므로, 중요한 정보는 저장해 둔다.

8. onStop()

프래그먼트는 더이상 보여지지 않게되며,  프래그먼트 기능 중지.

9. onDestroyView()

프래그먼트에 view들을 제거한다.

backstack을 사용했다면, 다시 해당 프래그먼트로 돌아 올때 onCreateVeiw()가 호출된다.

10. onDestroy()

프래그먼트를 제거하기 직전이다.

11.onDetach()

프래그먼트 비로소 제거하고 액티비티와의 연결도 해체시킨다.

Fragment의 상태 저장

activity와 같이, bundle을 이용하여 onSaveInstanceState 함수 안에서 저장하고,
activity의 프로세스가 fragment를 삭제하거나 activity가 멈췄다가 다시 생성되었을 때 fragment의 상태를 되돌리고 싶으면 onCreate()나 onCreatView()나 onActivityCreated()함수 안에서 상황에 따라 다시 상태를 돌리면 된다.

Fragment lifecycle과 Activity lifecycle의 다른 점

fragment는 백스택에 저장되고 상태를 유지해야 한다는 점
Activity는 시스템에서 자동적으로 백스택에 넣어진다.
하지만 fragment는  트랜잭션을 통해서 activity에서 fragment를 백스택에 넣으라고 addToBackStack() 함수를 통해 요청해야 한다.

0개의 댓글