フラグメントを作成する

フラグメントとは、アクティビティのモジュール式セクションのようなもので、独自のライフサイクルを持ち、独自の入力イベントを受信します。アクティビティの実行中に、フラグメントの追加や削除を行うことができます(別のアクティビティで再利用できる「サブアクティビティ」のようなものです)。このレッスンでは、サポート ライブラリを使用して Fragment クラスを拡張し、Android 1.6 までの古いシステム バージョンを搭載しているデバイスにアプリを対応させる方法について説明します。

フラグメントのライフサイクル メソッド内で依存コンポーネントをセットアップするのではなく、ライフサイクル対応コンポーネントを作成するようにしてください。このコンポーネントは、フラグメントがそのライフサイクルを通過するときに、必要なセットアップまたは破棄を処理できます。ライフサイクル対応コンポーネントは、他のフラグメントおよびアクティビティで再利用でき、コードの重複を回避できるため、フラグメント / アクティビティ自体で行う必要のあるセットアップの量を減らすことができます。詳細については、ライフサイクル対応コンポーネントを使用してライフサイクルを処理するをご覧ください。

このレッスンを開始する前に、サポート ライブラリを使用する Android プロジェクトをセットアップする必要があります。サポート ライブラリを使用したことがない場合は、サポート ライブラリをセットアップするを参照して、v4 ライブラリを使用するプロジェクトをセットアップしてください。ただし、Android 2.1(API レベル 7)と互換性のある v7 appcompat ライブラリを使用して、アクティビティにアプリバーを組み込むこともできます。このライブラリには Fragment API も収録されています。

フラグメントの実装方法については、フラグメントをご覧ください。また、関連サンプルアプリもご覧ください。

Fragment クラスを作成する

フラグメントを作成するには、Fragment クラスを拡張して、主要なライフサイクル メソッドをオーバーライドし、アプリロジックを挿入します。これは、Activity クラスの場合と同様の手順です。

Fragment を作成する場合の相違点の 1 つとして、レイアウトを定義する際に 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)
        }
    }
    

Java

    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 限定子で指定)、アクティビティに 2 つのフラグメントを追加するレイアウト ファイルの例を以下に示します。

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

Java

    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 を作成するをご覧ください。