2012年3月14日水曜日

Android FragmentTransaction のまとめ

add / remove
  • add(int containerViewId, Fragment fragment, String tag)
    ・Activity の状態に fragment を追加
    ・fragment がすでに Activity に追加されている場合なにも起こらない(detach したインスタンスを add しても表示されない)
    ・containerViewId が 0 ではない場合、fragment の onCreateView() が null でなければそれを containerViewId の ViewGroup に追加

     onAttach()
    → onCreate()
    → onCreateView()
    → onActivityCreated()
    → onStart()
    → onResume()

    * remove() 後に detach() された後の場合は onAttach() → onCreate()

    * back stack にあるインスタンスを add する場合は
     onCreateView()
    → onActivityCreated()
    → onStart()
    → onResume()

  • remove(Fragment fragment)
    ・Activity の状態から fragment を削除
    ・fragment がすでに Activity から削除されている場合なにも起こらない
    ・fragment の View が container に追加されている場合、その View は container から削除される

     onPause()
    → onStop()
    → onDestroyView()
    → onDestroy()
    → onDetach()

    * detach() された後の場合は onDestroy() → onDetach()

    * addToBackStack() を呼んでいる場合は
     onPause()
    → onStop()
    → onDestroyView()


replace
  • replace(int containerViewId, Fragment fragment, String tag)
    ・container にすでに追加されている Fragment を置き換える
    ・処理としては、同じ containerViewId に追加されている全ての Fragment に対して remove(Fragment) を呼び、それから add(containerId, fragment, tag) を呼ぶのと同じ
    ・置き換えられる Fragment と置き換える fragment が同じインスタンスの場合、onResume() まで呼ばれるが View が表示されないことがある

    置き換えられる Fragments :
     onPause()
    → onStop()
    → onDestroyView()
    → onDestroy()
    → onDetach()

    * addToBackStack() を呼んでいる場合は
     onPause()
    → onStop()
    → onDestroyView()


    置き換える fragment :
     onAttach()
    → onCreate()
    → onCreateView()
    → onActivityCreated()
    → onStart()
    → onResume()

    * back stack にあるインスタンスに置き換える場合は
     onCreateView()
    → onActivityCreated()
    → onStart()
    → onResume()


show / hide
  • show(Fragment fragment)
    ・hidden 状態になっている fragment (の View)を表示する
    ・fragment のライフサイクル状態は変わらない
    ・container に View が追加されている fragment にのみ意味がある
    ・fragment がすでに Activity から削除されている場合なにも起こらない
    ・detach が呼ばれた後でも適用される

  • hide(Fragment fragment)
    ・存在している fragment を隠す(hidden 状態にする)
    ・fragment のライフサイクル状態は変わらない
    ・container に View が追加されている fragment にのみ意味がある
    ・fragment がすでに Activity から削除されている場合でも適用されることがある、例えば同じインスタンスに対して add → remove → hide → add すると View は hidden 状態になっている、ここで show すると表示される
    ・detach が呼ばれた後でも適用される


attach / detach (API Level 13 から)
  • attach(Fragment fragment)
    ・detach() によって UI から取り外されている fragment を再度取り付ける
    ・UI に取り付けられる View 階層が再生成され、表示される
    ・fragment がすでに Activity から削除されている場合でも適用される、例えば add → remove → detach → attach の場合、onAttach() から onResume() まで呼ばれるが View は表示されない、View を表示するにはここから detach → attach をさらに呼ぶか remove → add をさらに呼ぶしかない
    ・onCreateView() は呼ばれるが onAttach(), onCreate() は呼ばれない

     onCreateView()
    → onActivityCreated()
    → onStart()
    → onResume()

  • detach(Fragment fragment)
    ・UI から fragment を取り外す
    ・back stack にある状態(fragment は UI から削除されているが fragment manager によって依然としてその状態が管理されている)と同じ
    ・この状態に入ると View の階層は破棄される
    ・fragment がすでに Activity から削除されている場合でも適用される、例えば add → remove → detach → add の場合ここでは onAttach() → onCreate() までしか呼ばれない、ここで attach() を呼ぶと onCreateView() → onActivityCreated() → onStart() → onResume() と呼ばれて View が表示される
    ・onDestroyView() は呼ばれるが onDestroy(), onDetach() は呼ばれない

     onPause()
    → onStop()
    → onDestroyView()



0 件のコメント:

コメントを投稿