[Android] Fragment 2 — Fragment 보여주기와 추가, 교체, 삭제

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

지난 포스트에서 Fragment에 대해 알아보고, 직접 Fragment를 생성해보았다. 그러나 단순히 Fragment 클래스를 생성하고 레이아웃을 만든 것만으로는 화면에서 Fragment를 볼 수 없다. 화면에서 Fragment를 띄우려면 어떤 방법들이 있는지 살펴보자.

Layout에서 Fragment 추가하기

Layout에서 fragment를 추가해보자. 먼저 지난 Fragment를 가시적으로 확인하기 위하여 Fragment가 독자적으로 갖고 있는 layout내에 배경을 바꿔주고 View를 추가해보자.

Fig1–1는 fragment가 그릴 layout을 구성한 것이다. (fragment를 생성하는 방법은 여기를 참조해주시면 감사하겠습니다.)

Fig1–1. Fragment의 layout 구성하기

이번엔 Fragment를 Activity에 추가해보자. 먼저 FragmentTestActivity라는 Activity를 생성해주고, Activity가 보여줄 layout xml 파일에 fragment를 추가하면 된다.

Fig1–2. Activity의 Layout xml 파일에서 fragment 추가하기

Fig1–2를 보면 preview에는 직접적으로 fragment가 안보이는데, 앱을 실행하면 Fig1–1에 그린 fragment가 잘 보이는 것을 볼 수 있다. 여기서 Fig1–1에는 화면이 꽉차도록 그려졌는데, Fig1–2에는 높이가 작아진 것을 의아하게 생각할 수도 있다. 그 이유는 Fig1–1의 Fragment가 activity_fragment_test.xml의 fragment의 View 계층에서 밑으로 들어가기 때문이다.

또 이렇게 추가할 때 주의할 점은 fragment의 속성에 ‘id 혹은 tag’와, ‘name’값을 필수로 줘야한다는 것이다. id 혹은 tag는 Activity의 FragmentManager가 해당 Fragment를 찾는데 사용할 수 있다. name으로는 생성한 Fragment 클래스를 패키지 경로와 함께 기입해주어야 한다.

이렇게 추가된 Fragment는 layout을 그리는 Activity에 의해 호스팅된다.

Fragment 추가, 삭제, 교체하기

이번에는 Fragment를 호스트하는 Activity나 Fragment에서 코드로 Fragment를 추가하는 방법을 알아보자. 이 방법을 이용하면 Fragment를 추가할 수 있을 뿐만 아니라 삭제할 수도 있고, 다른 Fragment로 교체할 수도 있다. 시작하기 전에, 이 방법을 사용하려면 반드시 알아야 할 두 가지 클래스가 있다.

FragmentManager

FragmentManager는 Activity나 Fragment에서 하위의 Fragment들을 관리할 수 있도록 해주는 클래스이다. 이 Activity나 Fragment는 Fragment Manager 객체를 각각 하나씩만 갖는다.

Fig2. 하위의 Fragment들을 관리할 수 있게 해주는 FragmentManager (출처: https://developer.android.com/guide/fragments/fragmentmanager)

지난 포스트에서도 볼 수 있었던 Fig2을 보면 Host Activty나 Host Fragment가 하위의 Fragment들을 FragmentManager를 통해 관리하는 것을 알 수 있다. 사용자의 입력 이벤트에 따라 Fragment를 추가, 삭제, 교체등의 작업들을 수행할 수 있게 해준다.

FragmentTransaction

transaction은 fragment에 관련된 작업에서, 작업의 단위를 뜻한다. 작업을 시작하기 전에는 FragmentManager를 통해 FragmentTransaction을 생성해야하고, 행해야 할 작업들을 정했을 땐 FragmentTransaction 객체를 통해 그 작업을 실행하라고 알려줘야 한다. FragmentTransaction을 통해 Fragment를 추가, 삭제, 교체 작업을 실질적으로 수행시킬 수 있고, ‘뒤로 가기’ 버튼을 눌렀을 때 그 전 Activity를 불러오는 것이 아닌 그 전 Fragment Transaction으로 이동시키는 것도 가능하다.

FragmentManager와 FragmentTransaction으로 fragment 제어하기

Fig3. 코드로 fragment 추가 예시와 FragmentContainerView

Fig3은 Kotlin 코드로 fragment를 추가하는 방법을 나타내고 있다. 추가하는 코드만 기재했지만, 삭제와 교체 역시 FragmentManager와 FragmentTransaction를 사용하는 전체적인 틀은 동일하다.

Fig4. 코드로 fragment 제어하는 방법

Fig4는 fragment를 코드로 추가하는 과정을 정리한 그림이다.

  • 중요한 것은 transaction 객체에 commit()을 해줘야 작업이 실행된다는 것이며, 한 번 commit()한 객체를 다시 commit하면 오류가 날 수 있으므로 하나의 작업당 하나의 transaction 을 사용하자. Kotlin에서는 다음과 같은 방식으로 코드를 간결하게 사용할 수 있다. (이 문법에 대해 궁금하다면 ctrl+b를 눌러 commit 함수의 구현을 보고, 링크의 ‘수신 객체’를 참고하자.)
Fig5. 간결한 방법 사용하기
  • FragmentContainerView는 FrameLayout을 상속받기 때문에, FrameLayout과 뷰 배치가 비슷하다.

FragmentTransaction의 추가, 삭제, 교체와 작업 수행 함수

Fig5. FragmentTransaction의 추가, 삭제, 교체와 작업 수행

Fig5는 FragmentTransaction 객체를 통해 추가, 삭제, 교체를 진행하는 함수와, 작업을 수행하라고 지시하는 함수를 정리한 표이다. 이 중에서 add(), remove(), attach(), detach(), replace()는 Fragment Manager에 의해 관리될 때 Fragment Lifecycle의 함수에도 관련되는데, 그 과정을 Fig6에 나타냈다.

Fig6. Fragment Transaction 함수들과 Fragment Lifecycle 관계

Reference

  1. [Ted’s IT Repository] “안드로이드 — 프래그먼트 관리 (Fragment manager)” — https://tedrepository.tistory.com/6

--

--

dEpayse
dEpayse_publication

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