フラグメントは、アクティビティ内のユーザー インターフェースのモジュール化された部分を表します。フラグメントは独自のライフサイクルを持ち、独自の入力イベントを受信します。アクティビティの実行中に、フラグメントの追加や削除を行うことができます。
このドキュメントでは、フラグメントを作成し、アクティビティに組み込む方法について説明します。
環境をセットアップする
フラグメントは 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.8.5" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.5" // 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
内に埋め込む必要があります。FragmentActivity
は AppCompatActivity
の基本クラスです。このため、アプリに下位互換性を提供するために 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(); } } }
上記の例では、savedInstanceState
が null
である場合にのみ、フラグメント トランザクションが作成されます。これは、アクティビティが最初に作成されたときにフラグメントが 1 回だけ追加されるようにするためです。設定変更が行われてアクティビティが再作成されると、savedInstanceState
は null
でなくなり、フラグメントは 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
について詳しくは、フラグメント マネージャー ガイドをご覧ください。