Met4licのあけくれ帖

日常とか、勉強したこととかいろいろ書いていくつもりのブログです

Androidのお勉強「Fragment」

さて、今回は長らく僕を悩ませてくれたFragmentを攻略して行こうと思います。
参考にしたのは毎度の事ながらこちら↓
Fragment | Android Developers

こんなに長くなるとは思わなかった…
1ページにまとめると恐ろしいことになるね。
とにかく読みづらいので、読むことはお勧めしません。
あ、本当に理解している人で教えてくださる人は読んでください。土下座して頼みます。

Fragmentとは

Activityの中で使える、UIを提供するもの。
独自のライフサイクルを持ち、Activityとはきっても切り離せない存在なのだそう。
ちなみに、このFragmentのライフサイクルは、Activityのライフサイクルと関連付いていて、
たとえば以下のような性質があるらしい。

  • Activityがstopしたとき

  →Activity内のFragmentはstartできない

  • Activityがdestroyされたとき

  →Activity内のすべてのFragmentもDestroyされる

まぁ、仕組みを考えたら当然っちゃ当然ですよね。
Activityが上にあるんだから、上司が許さなきゃ部下が仕事できないみたいなね。

ここまでがリファレンスの説明。
詳しく知るにはなにやらDeveloper guideを参照せよ、とのこと。
↓Developer guide
Fragments | Android Developers

取り扱い

どうやらFragmentはActivityが動いてるときには、
任意のFragmentを操作できるらしい。
たとえば新しいFragmentを生成したり、削除したりね。

動き

どういう動きをするのか、チラッと書いてあったのでまとめると

  • 新しい、または別のFragmentが上位(ユーザに見える部分)にくると、それまであったFragmentはバックスタックに積まれる。

 ここでいわれているバックスタックは、Activityが管理しているそうです。

  • バックスタックに積むことで、ユーザが戻るボタンを押すことで、そのバックスタックから前のFragmentを取り出せる。

とのこと。また、Fragmentは
Activityのlayoutの一部として使うこともできるが、推奨されないとも。

Lifecycle

流れは以下。(図を挿入予定)

  1. Fragmentが追加される
  2. onAttach()
  3. onCreate()
  4. onCreateView()
  5. onActivityCreated()
  6. onStart()
  7. onResume()
  8. 別のFragmentがフォアグラウンドに来るorバックスタックに積まれる
  9. onPause()
  10. onStop()
  11. onDestroyView() (Fragmentがバックスタックから取り出されればonCreateView()へ)
  12. onDestroy()
  13. onDetach()
役割

まだ調べきれてないので、書ききれてない分は、後で戻ってきて追記していくことになるかも。

  • onCreate()

→onResumeとかされたときに保持しておきたいものを初期化する

  • onCreateView()

 →UIを提供する際にここでViewを返す必要がある。が、UIを持たないFragmentの場合はNullを返しても良いらしい

  • onPause()

 →ここで残しておきたいユーザセッションなどを引き渡す必要がある

で、ここから下は、どうやらActivityと紐づいてるものだそうで、UIを提供することに関連したはたらきをするらしい

  • onAttach()

 →Activityがここで渡される。Contextを取得する際、getActivity()を呼ぶ場合はここで呼ぶほうが良い。

  • onCreateView()

 →前述のとおり

  • onActivityCreated()

 →ActivityのonCreate()がreturnすると呼ばれる

  • onResume()

 →Activity内でFragmentが見えるようになったときに呼ばれる

  • onDestroyView()

 →FragmentのViewが削除されたときに呼ばれる

  • onDetach()

 →FragmentがActivityの管理下を離れた時に呼ばれる

とまぁつまり、ActivityのLifecycleと合わせるとより複雑な流れになるから、それぞれのタイミングで
やりたいことをすればいいんだよ、ってことだと思います。ただ、その中で使う必要のあるものは
きちんと確認しないと、すでにその段階に行っている時にはなかったり、まだ生成されていなかったり
といったことが起こる可能性があるよね、っていう話かな。
Developper's guidを見ると、特筆して、Contextの取得に関して書かれている。
これはonAttached()以外で呼ぶと、Nullを返す恐れがあるらしいからということらしい。こういった場合があるので、きちんと流れをつかむ必要がある。

Activityとの関連性

(ここにも図を挿入予定)
onStart,onResume,onPause,onStopはActivityのそれぞれのメソッドに、
onAttach,onCreate,onCreateView,onActivityCreatedはActivityのCreated、
onDestroyView,onDestroy,onDetachはActivityのDestroyedが呼ばれたときに
それぞれ呼ばれる。

  • バックスタックに関する扱い

Activityはsystemによって半自動的にバックスタックに積まれ、状態が保存されるのに対して、
FragmentはホストとなるActivityによって、しかもaddToBackStack()を呼ばないと積まれない

このほか、使い方などがあるが今回はここまでにしよう。。。
また追記していきます。。