Fragment: その概要、AndroidのフラグメントとFragmentManager

著者: IT Sectr 公開日: 2026-02-22 読了時間: 7 分

Fragment はAndroidの再利用可能なUIコンポーネントで、Activityに埋め込まれ、FragmentManagerを介して管理されます。各フラグメントには独自のライフサイクル、レイアウト、状態があります。Fragmentは異なる画面サイズへの適応とコードの再利用を簡素化します。詳細はGoogle公式ガイドをご覧ください。

重要ポイント

  • Fragment — Activity内で独自のライフサイクルとレイアウトを持つUIコンポーネント
  • FragmentManager — フラグメントトランザクションとバックスタックを管理するクラス
  • FragmentTransaction — フラグメントの追加、置換、削除のためのアトミック操作
  • Jetpack Fragment — Android 1.6(API 4)までの下位互換性を提供するライブラリ
  • ViewModel — 1つのActivity内でフラグメント間のデータ交換を行う共有コンポーネント

Fragmentとは?

Fragment はActivity内の画面の一部を表すモジュール式Androidユーザーインターフェースコンポーネントです。Fragmentは独自のレイアウトを管理し、ライフサイクルイベントを処理し、状態を保存できます。モジュール性により、1つのフラグメントを異なるActivityや異なるデバイスで使用できます。

Fragment APIはタブレットをサポートするためにAndroid 3.0(Honeycomb、API 11)で2011年に登場しました。それ以前は、開発者は電話とタブレット用に別々のActivityを作成する必要がありました。Fragmentにより、独立したブロックから画面を組み立てることが可能になりました。2019年、GoogleはAPI 4までの下位互換性を持つJetpack Fragmentライブラリをリリースしました。

Google(2026)によると、Google Playのアプリの80%が何らかの形でFragmentを使用しています。Jetpack FragmentライブラリはGoogle Play Servicesを通じて100億回以上ダウンロードされています。FragmentはJetpack Composeの時代でもAndroidアーキテクチャの主要コンポーネントであり続けています。

Fragmentのライフサイクル

Fragment のライフサイクルはActivityよりも複雑です。なぜならホストActivityの状態に依存するからです。FragmentはActivityと同じ状態を経ますが、独自のコールバック(onAttach、onCreateView、onViewCreated、onActivityCreated、onDestroyView、onDetach)を追加します。

FragmentコールバックActivityでの相当目的
onAttachonCreateの前FragmentがActivityにアタッチ
onCreateonCreateUI以外のデータの初期化
onCreateViewonCreateinflaterによるレイアウトの作成
onViewCreatedonCreateビュー作成後のUI要素のバインド
onDestroyViewonDestroyビューの削除、UIリソースの解放
onDetachonDestroyFragmentがActivityからデタッチ

FragmentとActivityのライフサイクル比較

Fragmentのライフサイクルの主な違いは、onCreateとonDestroyの間にonCreateViewとonDestroyViewが呼び出されることです。FragmentはUIなしでも存在できます(onCreateViewがnullを返す場合)。Activityの再作成後、FragmentManagerは自動的にフラグメントを復元します。

FragmentManagerとトランザクション

FragmentManager はActivity内のフラグメントを管理する中心的なクラスです。フラグメントの追加、削除、置換、バックスタックの管理、状態の復元を担当します。FragmentManagerはsupportFragmentManager(AndroidX)またはfragmentManager(古いAPI)を介して利用できます。

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // フラグメントがまだ追加されていません — 作成中
        if (savedInstanceState == null) {
            val transaction = this.supportFragmentManager
                .beginTransaction()
            transaction.add(R.id.fragment_container, ListFragment())
            transaction.addToBackStack(null)
            transaction.commit()
        }
    }

    fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit()
    }
}

FragmentTransaction のトランザクションはアトミックです。commit()は次のLooperサイクルで実行をスケジュールします。即時実行にはcommitNow()を使用します。addToBackStack(null)はトランザクションをバックスタックに追加します — 戻るボタンで操作が元に戻ります。

Fragmentのライフサイクルメソッド

Kotlinの例を使ってFragmentのライフサイクルの主要メソッドを見てみましょう。onCreateViewはレイアウトを作成します — Activityとは異なり、メソッドはViewを返す必要があります。onViewCreatedはその直後に呼び出され、ここでidによる要素の検索が安全です。onDestroyViewはビュー参照をクリアする最後の機会です。

kotlin
class DetailFragment : Fragment() {

    private var _binding: FragmentDetailBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentDetailBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.textTitle.setText("詳細")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

View Binding パターン(_binding/binding)は、onDestroyView後にレイアウト参照がnullになることを保証します。ビュー破棄後にbindingにアクセスするとNullPointerExceptionが発生します。このパターンはGoogleがすべてのフラグメントに推奨しています。

フラグメント間のデータ転送

フラグメント間のデータ転送には、Androidはいくつかのメカニズムを提供しています。最も信頼性が高いのは、1つのActivityのフラグメント間で共有されるViewModelです。Fragment Result APIは単発のイベントに適しています。Bundle引数はフラグメント作成時のデータ用です。

kotlin
// 2つのフラグメント用の共有ViewModel
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

    fun select(item: Item) { _selectedItem.setValue(item) }
}

// フラグメントA:Fragment Result APIを介してイベントを送信
setFragmentResult("request_key", bundleOf("key" to "value"))

// フラグメントB:イベントを受信
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Fragment Result API(Fragment 1.3.0で追加)は、非推奨のsetTargetFragment/onActivityResultを置き換えます。このAPIは型安全で、Bundleを使用し、受信者の知識を必要としません。親FragmentManagerがフラグメント間の仲介役として機能します。

Fragment vs Activity:どちらを選ぶべきか

FragmentとActivity の選択はアプリケーションアーキテクチャに依存します。Fragmentはアダプティブレイアウト(電話+タブレット)、カスタムトランジションアニメーション、Jetpack Navigationの使用に必須です。Activityは1〜2画面のシンプルなアプリに適しています。

基準FragmentActivity
作成速度高速(軽量コンポーネント)低速(システムプロセス)
再利用性高い(1つのFragmentを異なるActivityで)低い(各画面に独自のActivity)
トランジションアニメーション柔軟(FragmentTransaction)制限あり(overridePendingTransition)
回転時の保存自動(マネージャーが復元)手動(onSaveInstanceState)
Deep LinksNavigation Component経由intent-filterによるネイティブサポート

Jetpack FragmentとJetpack Navigation

Fragment を扱う最新のアプローチはJetpack Navigation Componentで、手動のFragmentManager管理を置き換えます。このライブラリはNavGraph(XMLナビゲーショングラフ)、NavHostFragment、および型安全なデータ転送のためのSafe Argsを提供します。

Jetpack Fragmentライブラリ(androidx.fragment:fragment-ktx)には、FragmentResult API、DialogFragment、BottomSheetDialogFragment、およびLifecycle-awareコンポーネントとの統合が含まれています。2026年以降、GoogleはFragmentを直接ではなくJetpack Navigationを介してのみ使用することを推奨しています。

xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:startDestination="@+id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name=".ListFragment"
        android:label="リスト">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="詳細" />
</navigation>

よくある質問

FragmentManagerとは?

FragmentManager はフラグメントトランザクションを管理するクラスです。Activityコンテナ内でフラグメントの追加、削除、置換を行います。FragmentManagerはActivityの再作成時にフラグメントの状態を復元し、バックスタックを管理します。

FragmentとActivityの違いは?

Fragment はActivity内のUIの一部であり、独立して存在することはできません。Fragmentは画面回転時のActivityの再作成後も存続します。Activityは独自のLifecycleを持つ完全な画面であり、FragmentはActivityのLifecycleに依存します。

Activityの代わりにFragmentを使うべき時は?

Fragment — 画面が複数の独立したブロック(タブ、マスター詳細、タブレット対応)で構成される場合。Activity — 画面に繰り返し可能なブロックがない場合。GoogleはSingle Activity + 複数のFragmentを推奨しています。

フラグメント間でデータを転送する方法は?

3つの方法:親Activityを介する(共有ViewModel)、Fragment Result API(setFragmentResult)を介する、Fragment作成時のBundle引数を介する。ViewModelは再作成中もデータが保持されるため推奨される方法です。

Fragment Transactionとは?

Fragment Transaction はフラグメントセットを変更するアトミック操作です。FragmentManager.beginTransaction()でトランザクションを開き、add、remove、replace、hide、showを呼び出せます。各トランザクションはcommit()またはcommitNow()で終了します。

まとめ

  • Fragment はActivity内で独自のライフサイクル、レイアウト、状態を持つ再利用可能なUIコンポーネント
  • FragmentManager はフラグメントトランザクションを管理し、Activity再作成時に状態を復元
  • FragmentTransaction はフラグメントの追加、置換、削除、非表示のためのアトミック操作
  • FragmentのライフサイクルにはonAttachからonDetachまでの6つのコールバックと追加のonCreateViewポイントが含まれる
  • ViewModel は1つのActivity内のフラグメント間でデータを交換する推奨方法
  • Fragment Result API はフラグメント間の型安全な単発イベント転送を提供

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください