본문 바로가기
  • Jetpack 알아보기
Android/ʕ•ᴥ•ʔ

[Jetpack] 안드로이드 Fragment 개요와 생성

by 새우버거♬ 2022. 5. 24.

Fragment 란?


FragmentActivity 내에서 App UI의 재사용 가능한 부분 또는 동작을 나타낼 수 있는 컴포넌트입니다. 독립적으로 존재할 수 없고, Activity 또는 다른 Fragment에 결합해서 사용해야 합니다. 

 

Fragment의 수명 주기는 호스트 Activity의 수명 주기에 직접적으로 영향 받습니다. Activity가 일시정지되면 모든 Fragment도 일시정지 상태가 되고, Activity가 소멸되면 마찬가지로 모두 소멸됩니다. Activity가 실행 중인 동안(Resume)에는 각 Fragment를 개별적으로 추가, 제거할 수 있습니다.

FragmentActivity
Fragment를 지원하는 Activity 기본 클래스. 자식 클래스로는 AppCompatActivity와 CarAppActivity가 있다.

 

철학

Fragment는 Android 3.0 (API 11)부터 도입되었습니다. 처음의 목적은 태블릿과 같은 큰 화면에서 유연한 UI 디자인을 지원하는 것이었습니다. Activity의 레이아웃을 Fragment로 나누면 런타임에서 Activity의 UI를 수정할 수 있고, 

이제는 이러한 디자인 요소의 목적뿐만 아니라 Fragment 지원 라이브러리를 통해 다양한 기능을 제공하고 있습니다.

 

Fragment 생성


Fragment를 생성하기 위해서는 우선 AndroidX Fragment 라이브러리를 포함해야 합니다.

dependencies {
    val fragment_version = "1.4.1"

    // Kotlin
    implementation("androidx.fragment:fragment-ktx:$fragment_version")
}

Activity를 생성하는 것처럼 AndroidX Fragment 클래스를 상속받고, 메소드를 오버라이드하면 끝.

class ExampleFragment : Fragment(R.layout.example_fragment)

 

Activity에 추가하기

일반적으로 Fragment를 Activity 레이아웃에 포함하려면 FragmentActivity 내에 Fragment를 구현해야 합니다. 하위 버전을 호환하기 위해 AppCompatActivity를 사용하고 있다면 Activity 기본 클래스를 변경할  필요는 없습니다.

 

XML을 통해 Fragment 추가

FragmentContainerView 요소를 이용해 Fragment를 Activity 레이아웃 XML에 명시적으로 추가할 수 있습니다.

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.example.ExampleFragment" />

 

Kotlin에서 Fragment 추가

Programmatically하게 Fragment를 추가하기 위해서는 우선 Activity 레이아웃 XML에 FragmentContainerView를 추가하고,

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

 

FragmentActivity 내의 FragmentManager로 FragmentTransaction을 생성합니다.

Activity의 onCreate() 안에서 add() 메소드를 통해 container ViewGroup ID를 전달하고, Fragment 클래스를 추가해서 commit하면 됩니다.

class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) {
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view)
            }
        }
    }
}

 

사용자 인터페이스 추가하기

Fragment는 자체 레이아웃을 제공합니다. 레이아웃을 제공하려면 필수로 onCreateView() 메소드를 구현하고, Fragment의 루트 레이아웃인 View를 반환해야 합니다.

class ExampleFragment : Fragment() {

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

 

onCreateView()로 전달된 매개변수는 아래 세가지입니다.

  • inflater: LayoutInflater
    • XML에 정의된 리소스를 View 객체로 반환해주는 클래스
    • inflate() : 레이아웃 리소스 ID, 레이웃 상위가 될 ViewGroup, attachToRoot 값(true : 즉시, false : 지금 x)
  • container: ViewGroup?
    • Activity 레이아웃으로부터 전달된 상위 ViewGroup
  • savedInstanceState: Bundle?
    • Fragment가 재개되는 중인 경우, 이전 인스턴스에 대한 데이터를 제공