フラグメントを作成する

フラグメントは、アクティビティ内のユーザー インターフェースのモジュール化された部分を表します。フラグメントは独自のライフサイクルを持ち、独自の入力イベントを受信します。アクティビティの実行中に、フラグメントの追加や削除を行うことができます。

このドキュメントでは、フラグメントを作成し、アクティビティに組み込む方法について説明します。

環境をセットアップする

フラグメントは AndroidX Fragment ライブラリへの依存関係を必要とします。この依存関係を含めるには、プロジェクトの settings.gradle ファイルに Google Maven リポジトリを追加する必要があります。

Groovy

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

Kotlin

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

AndroidX Fragment ライブラリをプロジェクトに追加するには、アプリの build.gradle ファイルに次の依存関係を追加します。

Groovy

dependencies {
    def fragment_version = "1.6.2"

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.6.2"

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

Fragment クラスを作成する

フラグメントを作成するには、AndroidX の Fragment クラスを拡張し、そのメソッドをオーバーライドしてアプリロジックを挿入します。これは Activity クラスを作成する場合と同様の手順です。独自のレイアウトを定義する最小のフラグメントを作成するには、フラグメントのレイアウト リソースをベース コンストラクタに指定します。次の例をご覧ください。

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment)

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }
}

Fragment ライブラリには、より高度なフラグメント ベース クラスもあります。

DialogFragment
フローティング ダイアログを表示します。Activity クラスのダイアログ ヘルパー メソッドを使用しない場合、代わりにこのクラスを使用してダイアログを作成できます。このクラスでは、フラグメントが Dialog の作成とクリーンアップを自動的に行うためです。 詳しくは、DialogFragment を使用したダイアログの表示をご覧ください。
PreferenceFragmentCompat
Preference オブジェクトの階層をリストで表示します。PreferenceFragmentCompat を使用してアプリ用の設定画面を作成できます。

フラグメントをアクティビティに追加する

通常、UI の一部分をそのアクティビティのレイアウトに提供するには、フラグメントを AndroidX FragmentActivity 内に埋め込む必要があります。FragmentActivityAppCompatActivity の基本クラスです。このため、アプリに下位互換性を提供するために AppCompatActivity をすでにサブクラス化している場合、アクティビティの基本クラスを変更する必要はありません。

フラグメントをアクティビティのビュー階層に追加するには、アクティビティのレイアウト ファイルでフラグメントを定義するか、アクティビティのレイアウト ファイルでフラグメント コンテナを定義してから、プログラムでアクティビティの中からフラグメントを追加します。いずれの場合でも、FragmentContainerView を追加して、アクティビティのビュー階層内でフラグメントを配置する場所を定義する必要があります。フラグメントのコンテナとして FragmentContainerView を必ず使用することを強くおすすめします。FragmentContainerView には、FrameLayout などの他のビューグループで提供されないフラグメントに固有の修正が含まれているためです。

XML でフラグメントを追加する

アクティビティ レイアウトの XML にフラグメントを宣言的に追加するには、FragmentContainerView 要素を使用します。

単一の FragmentContainerView を含むアクティビティ レイアウトの例を以下に示します。

<!-- res/layout/example_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" />

android:name 属性は、インスタンス化する Fragment のクラス名を指定します。アクティビティのレイアウトがインフレートされるとき、指定されたフラグメントがインスタンス化され、onInflate() が新しくインスタンス化されたフラグメントで呼び出され、FragmentManager にフラグメントを追加するために FragmentTransaction が作成されます。

プログラムでフラグメントを追加する

アクティビティのレイアウトにプログラムでフラグメントを追加するには、レイアウトに FragmentContainerView を含めてフラグメント コンテナとして機能させる必要があります。次の例をご覧ください。

<!-- res/layout/example_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" />

XML のアプローチとは異なり、android:name 属性は FragmentContainerView で使用されていないため、特定のフラグメントが自動的にインスタンス化されることはありません。代わりに、FragmentTransaction を使用してフラグメントをインスタンス化し、アクティビティのレイアウトに追加します。

アクティビティの実行中に、フラグメントの追加、削除、置き換えなどのフラグメント トランザクションを行えます。FragmentActivity では、FragmentManager のインスタンスを取得し、それを使用して FragmentTransaction を作成できます。次に、アクティビティの onCreate() メソッド内で FragmentTransaction.add() を使用してフラグメントをインスタンス化し、レイアウト内のコンテナの ViewGroup ID と追加するフラグメント クラスを渡してトランザクションを commit します。次の例をご覧ください。

Kotlin

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

Java

public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.fragment_container_view, ExampleFragment.class, null)
                .commit();
        }
    }
}

上記の例では、savedInstanceStatenull である場合にのみ、フラグメント トランザクションが作成されます。これは、アクティビティが最初に作成されたときにフラグメントが 1 回だけ追加されるようにするためです。設定変更が行われてアクティビティが再作成されると、savedInstanceStatenull でなくなり、フラグメントは savedInstanceState から自動的に復元されるため、フラグメントの 2 回目の追加は必要はありません。

フラグメントに初期データが必要な場合は、FragmentTransaction.add() への呼び出しで Bundle を指定してフラグメントに渡すことができます。次の例をご覧ください。

Kotlin

class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) {
            val bundle = bundleOf("some_int" to 0)
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view, args = bundle)
            }
        }
    }
}

Java

public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            Bundle bundle = new Bundle();
            bundle.putInt("some_int", 0);

            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.fragment_container_view, ExampleFragment.class, bundle)
                .commit();
        }
    }
}

次に、requireArguments() を呼び出して、引数 Bundle をフラグメント内から取得します。各引数を取得するには、適切な Bundle ゲッター メソッドを使用します。

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val someInt = requireArguments().getInt("some_int")
        ...
    }
}

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        int someInt = requireArguments().getInt("some_int");
        ...
    }
}

関連ドキュメント

フラグメント トランザクションと FragmentManager について詳しくは、フラグメント マネージャー ガイドをご覧ください。