Fragment 만들기

Fragment를 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, Activity 실행 중에 추가 및 삭제가 가능한 Activity의 모듈식 섹션이라고 생각하면 됩니다(다른 Activity에 재사용할 수 있는 "하위 Activity"와 같은 개념). 이 과정은 Android 1.6과 같은 낮은 시스템 버전을 실행하는 기기와 앱이 호환성을 유지할 수 있도록 지원 라이브러리를 이용해Fragment 클래스를 확장하는 방법을 보여줍니다.

Fragment의 수명 주기 메서드에서 종속적 구성 요소를 설정하는 대신 수명 주기를 인식하는 구성 요소를 생성해야 합니다. 이 구성 요소는 Fragment가 수명 주기를 지나는 동안 설정을 처리하거나 필요한 해체를 수행할 수 있습니다. 그 후 수명 주기를 인식하는 구성 요소를 다른 Fragment와 Activity에 다시 사용하여 코드의 중복을 피하고 Fragment/Activity 자체에서 수행해야 하는 설정 항목을 줄일 수 있습니다. 자세한 내용은 수명 주기 인식 구성 요소로 수명 주기 처리를 참조하세요.

이 과정을 시작하기 전에 먼저 Android 프로젝트가 지원 라이브러리를 사용하도록 설정해야 합니다. 지원 라이브러리를 사용해본 적이 없는 경우, Support Library Setup 문서에 따라 프로젝트가 v4 라이브러리를 사용하도록 설정하세요. 하지만 Android 2.1(API 레벨 7)과 호환되고 Fragment API도 포함하는 v7 appcompat 라이브러리를 대신 사용하여 앱 바를 Activity에 포함할 수도 있습니다.

Fragment 구현에 대한 자세한 내용은 Fragments를 참조하세요. 관련 샘플 앱을 살펴보면서 더욱 자세히 알아볼 수도 있습니다.

Fragment 클래스 생성

Fragment를 생성하려면 Fragment 클래스를 확장한 후 Activity 클래스에서와 마찬가지로 주요 수명 주기 메서드를 재정의하여 자체 앱 로직을 삽입합니다.

Fragment 생성 시 한 가지 차이점은 레이아웃 정의에 onCreateView() 콜백을 사용해야 한다는 점입니다. 사실 Fragment 실행에 필요한 콜백은 이것뿐입니다. 다음은 자체 레이아웃을 지정하는 간단한 Fragment의 예입니다.

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;

public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.article_view, container, false);
    }
}

Activity와 마찬가지로, Fragment는 Fragment가 Activity에 추가되거나 Activity에서 삭제될 때, 그리고 Activity가 수명 주기 상태 간에 전환될 때 Fragment의 상태를 관리할 수 있는 다른 수명 주기 콜백을 구현해야 합니다. 예를 들어 Activity의 onPause() 메서드가 호출되면 Activity 내 모든 Fragment도 onPause() 호출을 받게 됩니다.

Fragment 수명 주기 및 콜백 메서드에 대한 자세한 내용은 Fragments 개발자 가이드를 참조하세요.

XML을 이용해 Activity에 Fragment 추가

Fragment는 재사용이 가능한 모듈식 UI 구성 요소인 반면, Fragment 클래스의 각 인스턴스는 상위 FragmentActivity와 연결되어야 합니다. Activity 레이아웃 XML 파일 안에 각각의 Fragment를 정의하여 이 연결을 설정할 수 있습니다.

참고: FragmentActivity는 지원 라이브러리에서 제공하는 특수한 Activity이며, API 레벨 11보다 낮은 시스템 버전에서 Fragment를 처리하는 데 사용합니다. 지원하는 가장 낮은 시스템 버전이 API 레벨 11 이상일 경우, 일반 Activity를 사용해도 됩니다.

다음은 기기 화면을 "대형"으로 간주할 때, 두 개의 Fragment를 Activity에 추가하는 레이아웃 파일의 예입니다(디렉토리 이름에 large 한정자가 지정되어 있음).

res/layout-large/news_articles.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>

팁: 다양한 화면 크기의 레이아웃 생성에 대한 자세한 내용은 다양한 화면 크기 지원을 참조하세요.

그런 다음 레이아웃을 Activity에 적용합니다.

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);
    }
}

v7 appcompat 라이브러리를 사용하는 경우, Activity는 FragmentActivity의 하위 클래스인 AppCompatActivity를 대신 확장해야 합니다 자세한 내용은 앱 바 추가를 참조하세요.

참고: 레이아웃 XML 파일에서 Fragment를 정의하여 Activity 레이아웃에 Fragment를 추가하는 경우, 런타임에 Fragment를 삭제할 수 없습니다. 사용자 상호작용 중 Fragment를 넣었다 뺐다 하려면, Activity를 처음 시작할 때 Fragment를 Activity에 추가해야 합니다. 이 절차는 유연한 UI 빌드에서 설명합니다.