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
流れは以下。(図を挿入予定)
- Fragmentが追加される
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
- 別のFragmentがフォアグラウンドに来るorバックスタックに積まれる
- onPause()
- onStop()
- onDestroyView() (Fragmentがバックスタックから取り出されればonCreateView()へ)
- onDestroy()
- 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()を呼ばないと積まれない
このほか、使い方などがあるが今回はここまでにしよう。。。
また追記していきます。。