2011年6月16日木曜日

Fragmentについて



(作成中)


Fragmentのサンプル

難しい話は置いといて結果的にどうなるのか、
Android 3.1のエミュレータにインストールされている「ApiDemo」でUIを確認。
f:id:baroqueworksdev:20110618043421p:image:w640


サンプルプログラムはこちら。
http://developer.android.com/intl/ja/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html


ActivityにFragmentを追加しているのは以下のコード。

// Check what fragment is currently shown, replace if needed.
DetailsFragment details = (DetailsFragment)
                getFragmentManager().findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index) {
    // Make new fragment to show this selection.
    details = DetailsFragment.newInstance(index);

    // Execute a transaction, replacing any existing fragment
    // with this one inside the frame.
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.details, details);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();
}


以下の箇所で、「containerViewをR.id.detailsとして、フラグメントdetailsに置き換えます」と指定。
    ft.replace(R.id.details, details);



ft.commit()後、DetailsFragment.onCreateView()がコールされて、フラグメントのViewをActivityに渡している。


Hierarchy ViewでView階層を確認。
ピンク枠がFragmentのcontainerView(親View)
黄色枠がFragmentが持っているView

f:id:baroqueworksdev:20110618044501p:image:w640


GingerBread以前のバージョンでもLayout.xmlを駆使すれば、
見た目は真似できますね。


Fragmentのライフサイクル

FragmentのライフサイクルはActivityのライフサイクルに結び付けられています。

Resume状態になるまでに呼び出されるライフサイクルメソッド

method内容
onAttach()Activityに関連付けれた際に1度だけコールされる
onCreate()fragmentの初期化生成のためによばれる
onCreateView()fragmentのView階層を生成し戻り値として返す
onActivityCreated()Activity.onCreaateが完了したことをframentに通知
onStart()ActivityのonStart()と同等
onResume()ActivityのonResume()と同等


Destroy状態になるまでに呼び出されるライフサイクルメソッド

method内容
onPause()fragment操作が一時停止状態に陥るとき、ActivityのonPause()と同等
onStop()fragment操作が一時停止状態となりユーザーから見えない状態、ActivityのonStop()と同等
onDestroyView()fragmentのView階層をCleanUp可能な状態
onDestroy()fragmentをCleanUp可能な状態
onDetach()Activityとの関連付けが解除された状態


上記のfragmentのライフサイクルとActivityのライフサイクルとの関係を、図に記す。
f:id:baroqueworksdev:20110617020005p:image

(developerサイトから拝借)

(作成中)

参考


http://developer.android.com/intl/ja/reference/android/app/Fragment.html

http://developer.android.com/intl/ja/guide/topics/fundamentals/fragments.html