The Android Developer Challenge is back! Submit your idea before December 2.

프래그먼트 만들기

프래그먼트를 활동의 모듈식 섹션이라고 생각할 수 있습니다. 자체 수명 주기가 있고 자체 입력 이벤트를 수신하며 활동이 실행되는 동안 추가하거나 삭제할 수 있습니다. 다른 활동에서 재사용할 수 있는 '하위 활동' 정도로 보면 됩니다. 이 과정에서는 지원 라이브러리를 사용하여 Fragment 클래스를 확장해 앱이 Android 1.6만큼 낮은 시스템 버전을 실행하는 기기와 계속 호환되도록 하는 방법을 보여줍니다.

프래그먼트의 수명 주기 메서드에서 종속적 구성요소를 설정하는 대신 수명 주기 인식 구성요소를 만들어야 합니다. 이 구성요소는 프래그먼트가 수명 주기를 통과할 때 필요한 설정이나 해체 작업을 처리할 수 있습니다. 그런 다음 수명 주기 인식 구성요소는 다른 프래그먼트와 활동에서 재사용되어 코드 중복을 방지하고 프래그먼트/활동 자체에서 실행해야 하는 설정의 양을 줄일 수 있습니다. 자세한 내용은 수명 주기 인식 구성요소로 수명 주기 처리를 읽어보세요.

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

프래그먼트 구현에 관한 자세한 내용은 프래그먼트를 참조하세요. 관련 샘플 앱을 탐색하여 자세히 알아볼 수도 있습니다.

프래그먼트 클래스 만들기

프래그먼트를 만들려면 Fragment 클래스를 확장하고 주요 수명 주기 메서드를 재정의하여 앱 로직을 삽입합니다. 이는 Activity 클래스에서 하는 방식과 유사합니다.

Fragment를 만들 때 한 가지 차이점은 onCreateView() 콜백을 사용하여 레이아웃을 정의해야 한다는 것입니다. 사실 프래그먼트 실행에 필요한 콜백은 이것뿐입니다. 예를 들어 다음은 자체 레이아웃을 지정하는 간단한 프래그먼트입니다.

Kotlin

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

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

자바

    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);
        }
    }
    

활동과 마찬가지로 프래그먼트는 다른 수명 주기 콜백을 구현해야 합니다. 이 콜백으로 프래그먼트가 활동에 추가되거나 활동에서 삭제될 때 그리고 활동이 수명 주기 상태 간에 전환될 때 프래그먼트 상태를 관리할 수 있습니다. 예를 들어 활동의 onPause() 메서드가 호출되면 활동의 모든 프래그먼트도 onPause() 호출을 수신합니다.

프래그먼트 수명 주기 및 콜백 메서드에 관한 자세한 내용은 프래그먼트 개발자 가이드를 참조하세요.

XML을 사용하여 활동에 프래그먼트 추가

프래그먼트는 재사용이 가능한 모듈식 UI 구성요소이지만 Fragment 클래스의 각 인스턴스는 상위 FragmentActivity와 연결되어야 합니다. 활동 레이아웃 XML 파일 안에 각 프래그먼트를 정의하여 이 연결을 달성할 수 있습니다.

참고: FragmentActivity는 API 레벨 11 이전의 시스템 버전에서 프래그먼트를 처리하기 위해 지원 라이브러리에서 제공된 특수 활동입니다. 지원하는 가장 낮은 시스템 버전이 API 레벨 11 이상이면 일반 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>
    

도움말: 다양한 화면 크기의 레이아웃 만들기에 관한 자세한 내용은 다양한 화면 크기 지원을 읽어보세요.

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

Kotlin

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

    class MainActivity : FragmentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.news_articles)
        }
    }
    

자바

    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 라이브러리를 사용한다면 활동은 FragmentActivity의 서브클래스인 AppCompatActivity를 대신 확장해야 합니다. 자세한 내용은 앱 바 추가하기를 읽어보세요.

참고: 레이아웃 XML 파일에서 프래그먼트를 정의하여 활동 레이아웃에 추가하면 런타임 시 프래그먼트를 삭제할 수 없습니다. 사용자 상호작용 중에 프래그먼트를 넣었다 뺐다 하려면 유연한 UI 빌드에서 보듯이 활동이 처음 시작될 때 프래그먼트를 활동에 추가해야 합니다.