[Android] Fragment 1 — Fragment의 이해와 생성

dEpayse
dEpayse_publication
9 min readApr 4, 2021
  • 본 포스트는 Kotlin 언어로 Android studio 에서 작업할 수 있는 내용을 담고 있습니다.
  • 본 포스트는 Kotlin 언어에 관한 설명은 없습니다. Kotlin에 관한 내용은 저의 다른 포스트를 참고해주시면 감사하겠습니다.

Fragment를 처음 접했을 때, Android Developers 공식 문서의 Fragment의 정의가 와닿지 않았다. 이번 포스트에선 Fragment에 대해 공부하고 정리하여 기록해보려고 한다.

Fragment 란?

Fragment의 핵심적인 특징을 토대로 Fragment에 대해 이해하기 쉽게 풀어보려고 한다. Activity는 사용자와 앱이 상호작용하는 진입점이고 하나의 화면을 구성하는 것인데, Fragment는 Activity 안에서 화면의 일부를 구성하는 것이라고 할 수 있다. (사실 Fragment는 또다른 Fragment 내에서도 생성될 수 있다. 상단에는 Activity와의 비교 설명을 위해 Activity 만 표기하였다.)

Fig1. Fragment 개념

Fragment는 Activity나 다른 Fragment에 의해 호스팅되어야하며, 독립적으로 화면 구성이 가능하고 자체적인 입력 이벤트를 처리할 수 있다. Activity에 속해 있는 Button들을 통하는 방법 등으로 Fragment를 보이게 하거나 안 보이게 할 수 있으며 다른 Fragment로 바꾸는 것도 가능하다. 이런 Fragment는 Activity의 일부분을 어떤 기준에 따라 나누는 것을 가능하게 하여, Activity의 화면 구성을 좀 더 유연하게 만들고 어떤 부분에선 관리도 더 쉽게 만들 수 있다.

특징

그럼 Fragment는 어떤 특징을 갖고 있을까? Fragment를 사용하기 전에, Fragment에 관해 조금 더 알아보자.

1. Fragment는 독립적으로 존재할 수 없다.

이미 언급했듯이, Fragment는 Activity나 다른 Fragment에 의해 호스팅되어야 한다. 좀 더 풀어서 이야기하면 Fragment는 독자적인 layout xml을 가질 수 있지만, 이 Fragment ‘객체’가 생기고 그려지는 것은 어떤 Activity 혹은 다른 Fragment 내에서 이루어지는 것이다. 이 때 Fragment는 Activity 혹은 다른 Fragment에 의해 호스팅되었다고 하며, Fragment를 갖고 있는 Activity나 다른 Fragment를 호스트 Activity 혹은 호스트 Fragment라고 한다. Fragment는 호스트 Activity나 Fragment의 뷰 계층에 속하게 된다.

Fig2. 독립적으로 존재할 수 없는 Fragment (출처: https://developer.android.com/guide/fragments/fragmentmanager)

Fig2의 Level은 Activity가 Fragment를 포함하고 있고, Fragment가 또 다른 하위 Fragment를 갖고 있을 때를 나타낸다. 항상 호스트하는 쪽은 FragmentManager라는 클래스의 객체를 통해 하위 Fragment들을 관리할 수 있다.

2. Fragment는 자체적인 수명주기를 갖는다.

Fig3–1. Fragment LifeCycle (참고 : https://developer.android.com/guide/fragments/lifecycle)

Fragment는 호스팅한 Activity나 Fragment가 Started 상태 이상일 때만 Fragment를 추가, 교체, 삭제할 수 있고, 이 과정에서 자체적인 수명주기를 갖는다. Fig3–2는 호스트 Activity와 Fragment의 LifeCycle을 실행 순서대로 나타낸 그림이다.

Fig3–2. Activity와 Fragment의 LifeCycle 관계 (출처 : https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-iii-fragments-afc87d4f37fd)

3. 재사용이 가능하다.

어떤 Fragment의 객체는 Activity나 다른 Fragment에 의해 호스팅되지만, 이 말이 하나의 Activity나 Fragment에서만 생성할 수 있다는 것은 아니다. 한 Fragment의 객체는 다수의 Activity에서 생성할 수 있다.

Fragment 생성하기

Android Studio에서 Fragment를 쉽게 추가할 수 있는 기능을 제공한다. 하단의 Fig4를 통해 빈 Fragment를 생성하면

  1. 시각적 화면을 구성하는 layout 파일 하나(.xml)와,
  2. layout을 보여주고 다양한 동작을 제어하는 kotlin 파일(.kt) 혹은 java 파일(.java)

두 가지가 생성된다. Activity 포스트에서 본 Activity를 추가했을 때 생기는 파일들과 구성이 동일한 것을 볼 수 있다. 코드 상에서 Fragment는 ‘Fragment 타입의 클래스’로 볼 수 있다.

Fig4–1. Blank Fragment 생성하기1
Fig4–2. Blank Fragment 생성하기2
Fig4–3. Blank Fragment 생성하기3

Blank Fragment를 생성하면 Fig4–3의 우측 그림과 같이 긴 코드의 Fragment가 만들어진다. onCreate()함수는 Activity에서도 본 함수라 익숙할 수 있는데, Fragment에는 onCreateView()함수도 존재하는 걸 확인할 수 있다. 다른 함수와 프로퍼티는 잠시 접어두고, Fragment가 어떤 과정을 거쳐 추가되는지 알아보자.

Fragment가 생성되는 과정

물론 Fig4의 방법을 통해 Fragment를 쉽게 생성할 수 있지만, 직접 Fragment를 생성하는 과정을 거쳐 얻고자 하는 것은 Fragment의 기본적인 형태를 아는 것과 과정 그 자체이다.

Fragment를 앱에 추가할 때 관련된 파일은 다음 두 가지이다.

  • Fragment class를 상속받는 kotlin 클래스 파일(.kt) 혹은 java 클래스 파일(.java)
  • layout xml 파일(.xml)

Activity를 추가할 땐 manifest 파일이 부가적으로 관련되지만, Fragment는 manifest 파일에 추가하지 않아도 된다.

Fragment 직접 생성하기①.

Fragment class를 상속받는 class 파일 생성하기

Fig5–1. Fragment를 상속받는 class 파일 생성하기

포스트 상단에서 코드 상의 Fragment는 Fragment 타입의 클래스라고 하였다. Fragment를 추가하기 위해, 먼저 Fragment타입의 클래스를 만들어보자. 방법은 java나 kotlin의 클래스를 만들고, Fragment를 상속받으면 된다. Android Studio에서 Fragment를 타이핑하며 자동완성을 이용하면 직접 import 줄을 작성하지 않아도 된다. 혹은 alt+enter를 입력하여 import하는 방법도 있다.

Fragment 직접 생성하기②.

layout xml 파일 생성하기

Fig5–2. layout xml 파일 생성하기

Fragment는 독자적인 layout xml을 갖는다. 구상된 화면을 보여주기 위해서는 화면을 구상하는 layout 파일을 생성해야 한다. layout 파일을 res(Resource를 의미)의 layout 디렉토리에 추가하면 된다.

Fragment 직접 생성하기③.

Fragment class를 상속받는 class 파일로 보여줄 layout(화면) 정하기

Fig5–3. Fragment를 상속받는 class 파일로 보여줄 layout(화면) 정하기

이제 Fragment 타입의 클래스 파일에 화면을 보여주는 코드를 작성하면 된다. onCreateView() 함수는 Fragment의 생명주기에 포함되는 함수이다.

Fragment 생성 시 주의 사항

  • Fragment를 생성할 때에는 항상 public이면서 인자가 없는 생성자를 포함해야한다. 만약 그렇지 않으면 런타임 오류가 발생할 가능성이 있다.

Reference

  1. [Pluu Dev] “Fragment Lifecycle과 LiveData” — https://tedrepository.tistory.com/6

--

--

dEpayse
dEpayse_publication

나뿐만 아니라 다른 사람들도 이해할 수 있도록 작성하는, 친절한 블로그를 목표로.