Fragment はAndroidの再利用可能なUIコンポーネントで、Activityに埋め込まれ、FragmentManagerを介して管理されます。各フラグメントには独自のライフサイクル、レイアウト、状態があります。Fragmentは異なる画面サイズへの適応とコードの再利用を簡素化します。詳細はGoogle公式ガイドをご覧ください。
重要ポイント
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 のライフサイクルはActivityよりも複雑です。なぜならホストActivityの状態に依存するからです。FragmentはActivityと同じ状態を経ますが、独自のコールバック(onAttach、onCreateView、onViewCreated、onActivityCreated、onDestroyView、onDetach)を追加します。
| Fragmentコールバック | Activityでの相当 | 目的 |
|---|---|---|
| onAttach | onCreateの前 | FragmentがActivityにアタッチ |
| onCreate | onCreate | UI以外のデータの初期化 |
| onCreateView | onCreate | inflaterによるレイアウトの作成 |
| onViewCreated | onCreate | ビュー作成後のUI要素のバインド |
| onDestroyView | onDestroy | ビューの削除、UIリソースの解放 |
| onDetach | onDestroy | FragmentがActivityからデタッチ |
Fragmentのライフサイクルの主な違いは、onCreateとonDestroyの間にonCreateViewとonDestroyViewが呼び出されることです。FragmentはUIなしでも存在できます(onCreateViewがnullを返す場合)。Activityの再作成後、FragmentManagerは自動的にフラグメントを復元します。
FragmentManager はActivity内のフラグメントを管理する中心的なクラスです。フラグメントの追加、削除、置換、バックスタックの管理、状態の復元を担当します。FragmentManagerはsupportFragmentManager(AndroidX)またはfragmentManager(古いAPI)を介して利用できます。
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)はトランザクションをバックスタックに追加します — 戻るボタンで操作が元に戻ります。
Kotlinの例を使ってFragmentのライフサイクルの主要メソッドを見てみましょう。onCreateViewはレイアウトを作成します — Activityとは異なり、メソッドはViewを返す必要があります。onViewCreatedはその直後に呼び出され、ここでidによる要素の検索が安全です。onDestroyViewはビュー参照をクリアする最後の機会です。
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引数はフラグメント作成時のデータ用です。
// 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とActivity の選択はアプリケーションアーキテクチャに依存します。Fragmentはアダプティブレイアウト(電話+タブレット)、カスタムトランジションアニメーション、Jetpack Navigationの使用に必須です。Activityは1〜2画面のシンプルなアプリに適しています。
| 基準 | Fragment | Activity |
|---|---|---|
| 作成速度 | 高速(軽量コンポーネント) | 低速(システムプロセス) |
| 再利用性 | 高い(1つのFragmentを異なるActivityで) | 低い(各画面に独自のActivity) |
| トランジションアニメーション | 柔軟(FragmentTransaction) | 制限あり(overridePendingTransition) |
| 回転時の保存 | 自動(マネージャーが復元) | 手動(onSaveInstanceState) |
| Deep Links | Navigation Component経由 | intent-filterによるネイティブサポート |
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を介してのみ使用することを推奨しています。
<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 はフラグメントトランザクションを管理するクラスです。Activityコンテナ内でフラグメントの追加、削除、置換を行います。FragmentManagerはActivityの再作成時にフラグメントの状態を復元し、バックスタックを管理します。
Fragment はActivity内のUIの一部であり、独立して存在することはできません。Fragmentは画面回転時のActivityの再作成後も存続します。Activityは独自のLifecycleを持つ完全な画面であり、FragmentはActivityのLifecycleに依存します。
Fragment — 画面が複数の独立したブロック(タブ、マスター詳細、タブレット対応)で構成される場合。Activity — 画面に繰り返し可能なブロックがない場合。GoogleはSingle Activity + 複数のFragmentを推奨しています。
3つの方法:親Activityを介する(共有ViewModel)、Fragment Result API(setFragmentResult)を介する、Fragment作成時のBundle引数を介する。ViewModelは再作成中もデータが保持されるため推奨される方法です。
Fragment Transaction はフラグメントセットを変更するアトミック操作です。FragmentManager.beginTransaction()でトランザクションを開き、add、remove、replace、hide、showを呼び出せます。各トランザクションはcommit()またはcommitNow()で終了します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。