Android 11 のデベロッパー プレビューが公開されました。ぜひお試しのうえ、フィードバックをお寄せください

フラグメントを作成する

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

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

このレッスンを開始する前に、お使いの Android プロジェクトでサポート ライブラリを使用するよう設定する必要があります。サポート ライブラリを使用したことがない場合は、Support Library のセットアップ ドキュメントを参照して 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 に関連付けられている必要があります。この関連付けを行うには、アクティビティの layout 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 ライブラリを使用している場合は、代わりに AppCompatActivity を拡張します。これは、FragmentActivity のサブクラスです。詳しくは、アプリバーの追加をご覧ください。

注: Layout XML ファイルでフラグメントを定義してアクティビティ レイアウトにフラグメントを追加する場合、実行時にはフラグメントを削除できません。ユーザー操作中にフラグメントの入れ替えを予定している場合は、フレキシブルな UI を作成するで説明するように、アクティビティの初回起動時にフラグメントをアクティビティに追加する必要があります。