Fragment에 대하여 - (1/2)

2020. 3. 1. 12:03Android

반응형

오늘의 개념:

Fragment - 1/2

 

 

아래의 내용들은 구글 공식문서를 바탕으로 정리한 것이다🐱‍👤

 

 

등장 배경 및 디자인 철학


  • Android 3.0(API level 11)에 처음으로 도입

  • 태블릿과 같은 대형 스크린에서 유연한 UI를 지원하기 위해

    • 아래 그림에서와 같이 태블릿에서는 2개의 Fragment를 동시에 보여줄 수 있고, 모바일에서는 1개의 Fragment씩 보임
  • Fragment는 모듈식의 재사용 가능한 구조로 만들어야 함 => Fragment는 독립된 모듈로 재사용이 가능.

  • 하나의 fragment에서 다른 fraagment를 직접 조작하게 만들면 안 된다

Fragment의 사용 예시 (출처 : Fragment 구글 공식 홈페이지)

 

 

 

Fragment는 언제 사용할 수 있을까?


  • 태블릿과 같은 큰 화면에서

  • Tab layouts

  • BottomBar Navigation

  • Dialog Fragment

  • 재사용되는 화면일 경우

  • 등등 

 

 

Fragment 생명주기


Fragment의 생명주기 (출처: 구글 공식 문서)

Fragment의 생명주기는 오른쪽 그림과 같다.

뭔가 Activity와 비슷한 거 같으면서도 되게 복잡해 보이는.. 🐱‍👤

 

자세히 보면, Activity의 생명주기 사이사이에 몇몇 함수들이 추가되어 있다. 이 함수들에 대해서는 바로 아래에서 자세히 설명하겠다.

 

일반적으로 Fragment를 사용할 때 onCreate(), onCreateView(), onPause()는 아래와 같은 이유로 구현해주는 것이 좋다.

 

onCreate()

: Fragment를 생성할 때 호출됨.

Fragment가 멈추고(paused or stopped) 새로 시작(resumed)될 때

유지하고 싶은 것들은 여기에서 초기화를 해야 함.

(예를 들어, 화면 회전이나 process kill 당했을 때 등)

 

onCreateView()

: Fragment에 레이아웃을 그리고 싶다면 여기서 반드시 view를 리턴해야 한다. 만약 fragment에서 UI가 필요 없다면 null을 리턴하면 된다.

override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.example_fragment, container, false)
        return view
    }

 

onPause() 

: 사용자가 fragment를 떠날 때 호출됨. 

onPause에서는 fragment가 일부 보임. 즉 화면의 일부만 가려졌을 때.

사용자가 그대로 화면을 떠날 수도 있기 때문에 유지해야 하는 변경 사항들은 여기서 처리해줘야 함.

 

 

 

Activity와 Fragment의 생명주기는 아랫부분을 제외하면 거의 똑같다.

- Activity는 back stack(뒤로 가기)을 알아서 저장해주는 반면, Fragment는 addBackStack() 함수를 써서 back stack을 저장해줘야 한다. Fragment에서 addBackStack()을 사용하지 않으면 back stack은 저장되지 않음. 즉, 뒤로 가기가 자동으로 안 된다는 거.

 

오른쪽 그림은 Activity와 Fragment의 생명주기의 관계를 잘 나타내고 있다.

Activity와 Fragment의 생명주기는 거의 비슷하지만,

Fragment에만 존재하는 생명주기는 아래와 같다.

 

 

onAttach()

: Fragment가 Activity에 추가되었을 때 호출됨 (Activity가 전달됨)

 

onCreateView()

: Fragment의 view를 그릴 때 호출됨

 

onActivityCreated()

: 함수명 그대로 Activity의 onCreate()가 리턴됐을 때 호출됨

 

onDestroyView()

: onCreateView()와 반대로 Fragment의 view가 지워질 때 호출됨

 

onDetach()

: onAttach()와 반대로 Activity에서 떼어질(?🤣) 때 호출됨

 

 

 

직접 Activity와 Fragment의 생명주기가 어떻게 동작하는지 로그로 찍어보자

시나리오

 

1번 과정 : MainActivity 시작

1번 과정에서 발생한 로그

 

2번 과정 : FragmentAcvity로 이동, FragmentAcvity에서는 FragmentA 시작

아래 로그를 보면,

예상과는 달랐던 것은 FragmentActivity와 FragmentA모두 resume() 된 후에 MainActivity의 onStop()이 호출된다는 점이다. 

2번 과정에서 발생한 로그

 

3번 과정 : FragmentActivity에서 FragmentA를 FragmentB로 교체

FragmentB로 교체하면 FragmentA가 모두 종료되고 이동하는 것이 아닌,

FragmentB의 onAttach, onCreate()가 먼저 호출되고 FragmentA가 종료되는 것을 볼 수 있다. 신기 ㅎㅎ

3번 과정에서 발생한 로그

 

4번 과정 : FragmentActivity에서 뒤로 가기 버튼을 눌러 다시 MainActivity로 돌아감

이 과정 역시,

MainActivity가 다시 시작된 후에 FragmentActivity와 FragmentB가 완전히 종료된다. 잘 알아둡시당!

4번 과정에서 발생한 로그

 

 

위와 같이 직접 생명주기 로그를 찍어보니 예상과는 다른 부분들이 있었다. 우리 모두 잘 알아둡시당✌️

생명주기 파악은 정말 중요하닥!!

 

Fragment를 직접 생성하고 데이터 전달은 어떻게 하는지 등의 사용법은 다음 블로그에서 이어가겠습니당 (_ _)

휴!

 

 

 

참고

Fragment 구글 공식 문서

 

프래그먼트  |  Android 개발자  |  Android Developers

A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section…

developer.android.com

https://academy.realm.io/posts/360andev-david-hope-fragments-activities-android-beginner/

반응형