カテゴリー
Kotlin言語

ゼロから始めるAndroidアプリ(Kotlin編)Unit3 – 2:フラグメント2(ライフサイクル)

Android Developers > スタートガイド > Kotlin と Android をゼロから学ぶ > Unit3 – ナビゲーションUnit3-2 の内容をまとめたものです(翻訳ではありません)


スターターコードを準備する

スターターコードの準備をしますね

  • このチュートリアルはスターターコード(このチュートリアルを進めるための半完成状態のプロジェクト)を使って進めます
  • スターターコードはつぎのいずれかを使います
    • チュートリアルの Unit3 – 1(アクティビティとインテントのチュートリアル)で単語アプリを作成している場合は、そのプロジェクトをそのまま使って構いません
    • こちらからダウンロード したプロジェクトをインポートして使っても構いません
  • ダウンロードしたスターターコードを使う場合は次のように準備します
    • 上記のURLにアクセスして Code > Download ZIP としてダウンロードして展開します
    • Android Studio でプロジェクトをインポートします(File > New > Import Project
  • Run でビルドしてから実行してみます。エラーなく動作するか確認してください
  • Project ペインで、どんなファイルが実装されているのか確認できます

フラグメントとフラグメントライフサイクル

フラグメントを使うならアクティビティはひとつあればいいんですね

  • フラグメントはアプリのUI部品(View)ですが、アクティビティのようにライフサイクルをもち、ユーザの入力に応えることができます
  • 画面に表示されているフラグメントは、必ずアクティビティのViewの階層に含まれています
  • フラグメントは再利用性とモジュール性を重視して設計されています。単一のアクティビティで複数のフラグメントを同時に扱うことができます
  • ひとつひとつのフラグメントは、それぞれ独立したライフサイクルで管理されます

フラグメントライフサイクル

フラグメントにはライフサイクルもあって、アクティビティみたいに使えるの

ほんとに同じかんじですね

  • フラグメント(Fragment)は、アクティビティと同じようにライフサイクルをもちます
  • ライフサイクルには状態(state)があり、それらの移り変わりに対応したコールバックメソッドがあるのも同様です
  • フラグメントライフサイクルの状態(state)は以下の5つです。Lifecycle.State enum(enum は列挙型の意味。複数の定数をひとつにまとめたもの)で表されます
状態説明
INITIALIZEDフラグメントの新しいインスタンスが生成された状態
CREATED最初のフラグメントのライフサイクルメソッドが呼ばれた状態。フラグメントに配置されたViewも作られます
STARTEDフラグメントが画面に表示される。しかしフォーカスは持っていない。つまりユーザ入力には応えられません
RESUMEDフラグメントは表示されていて、なおかつフォーカスをもっている状態です
DESTROYEDフラグメントオブジェクトは開放されています(インスタンス解除)
フラグメントライフサイクルの状態(state)

オーバーライドできるコールバックメソッド

アクティビティのときよりちょっと細かいかも…

アクティビティと同じく、Fragment クラスには多くのコールバックメソッドがあります。ライフサイクルの中で起こる様々なイベントに対応できます

コールバックメソッド説明
onCreate()フラグメントがインスタンス化され、CREATED の状態にある。しかし、対応する view はまだ生成されていない状態
onCreateView()レイアウトはここで生成します。フラグメントはすでにCREATED の状態に入っている
onViewCreated()view が生成された後に呼ばれます。この中で findViewById を使って view をプロパティに結び付けます
onStart()フラグメントはSTARTED状態に入っています
onResume()フラグメントはRESUMED状態に入っており、フォーカスをもっていてユーザの入力に応えることができます
onPause()フラグメントはSTARTEDに再度入ってきている。UIはユーザから見えています
onStop()フラグメントはCREATED状態に再度入ってきている。オブジェクトはインスタンスの状態だが、もはや画面には表示されていません
onDestroyView()フラグメントが DESTROYED状態になる直前に呼ばれます。view はすでにメモリから除去されているが、フラグメントオブジェクトはまだ存在しています
onDestroy()フラグメントが DESTROYED の状態に入っています
フラグメントライフサイクルのコールバックメソッド

ライフサイクルの状態とコールバックの関係

こんな風に対応してるんですね

フラグメントのライフサイクルとコールバックメソッドの関係をまとめると次のようになっています

ライフサイクルの状態(Lifecycle State)コールバック(Callback)
CREATEDonCreate()
onCreateView()
onViewCreated()
STARTEDonStart()
RESUMEDonResume()
STARTEDonPause()
CREATEDonStop()
onDestroyView()
DESTROYEDonDestroy()

onCreate , onCreateView , onViewCreated の違い

アクティビティの onCreate と、フラグメントの onCreate はちょっと違うの

気を付けないとですね

  • フラグメントライフサイクルとアクティビティライフサイクルはよく似ていますが、onCreate() の違いには注意します
  • アクティビティでは onCreate() でレイアウトを生成して view をバインドしますが、フラグメントの onCreate() は view が生成される前に呼ばれるため、ここでレイアウトを生成することはできません
  • フラグメントではレイアウトの生成は onCreateView() で行います
  • view が生成されたあとに onViewCreated() が呼ばれます。ここで view にプロパティをバインドします