【Android】Fragmentとは?Activity Vs Fragmentライフサイクル比較
最初に
Andoroidで画面に出力されるUI構成の最も基本的な要素はActivityです。
作ろうとするアプリの大きさが小さく、機能が複雑ではなく単純で、スマートフォン自体だけで使うならActivityだけを使っても構わないですが、ActivityはFragmentに比べてパフォーマンスが重く、リソースを多く使います。
一つのActivity内で複数のFragmentを独立的に構成したい!
そして、複数のデバイス(タブレットなどの大画面)でスペースの無駄のないUIを構成したい場合は?Fragmentが答えかもしれないです。
Fragmentを活用すれば簡単に使えるコードが複雑になるが、メモリ管理において効率的であり、画面転換もより順調です。
ほとんどのプロジェクトがSingle Activity-Multi Fragmentを持っているというです。何か調べて実装してました。
Fragmentをは
Fragment = Activity + View
グーグルではアクティビティのモジュール式セクションと定義しています。
簡単に言えば、Fragmentとは、一つのActivity内で生成される
- 自己ライフサイクル
- セルフ入力イベント
- アクティビティ実行中に動的に作成、交換、削除
- 再利用が可能
をふくめてActivityの複雑度を減らしながらUI変化に効率的に使われる構造です。
Fragmentの使用は、メッセンジャーアプリLINEが例です。
LINEの画面の下のタブバーにあるベクトルアイコンをクリックすると、友達リスト、会話リスト、ニュース、ショッピング画面などアイコンに合う画面を見ることができます。
全体画面自体はActivityで、途中で変わる部分がFragmentとして使えることです。
Fragmentの長所
上記の特徴が長所につながっています。
- 柔軟なui/ux実装(Activityを分割して画面の一部分を定義)
- レイアウト、動作処理、ライフサイクルを持つ独立したモジュール**
- 他のActivityでも使用でき再利用性↑
- Activity実行中に追加、交換、削除が可能
Activity Vs Fragmentライフサイクル比較
既存のActivityより細分化されています。
ActivityがonCreate()するとき、FragmentはonAttach()からonActivityCreated()メソッドまで呼び出します。
onAttach()
FragmentがActivityにattachされるときに呼び出される関数。
呼び出され、因子であるContextを持って親Activityにlistener interfaceをimplementした場合、型変換を通じて取得することができます。
onCreate()
Fragmentを生成する際にonCreate()を呼び出します。
初期化しなければならないリソースは、ここで初期化します。渡した値があれば、ここで変数を入れればいいです。 しかし、UI初期化は不可です。
onCreateView()
レイアウトをinflateするところ。Fragmentに合ったUIを描くには、メソッドでViewをリターンしなければならないです。(ここでViewオブジェクトを取得できます。)
FragmentがUIを提供しない場合、nullを返却すればいいです。
onActivityCreated()
ActivityでFragmentをすべて生成した後に呼び出される関数。
ActivityのonCreate()でsetContentView()した次に類似している。 View(UI)変更作業が可能です。
onStart()
Activityでの役割と似ています。 ユーザにFragmentが見えるようにする役割です。(Activityはstarted状態)
onResume()
Fragmentが画面に表示される段階、ユーザにフォーカスを当てた状態。 ユーザとの相互作用が可能です。
他のFragmentが追加される場合
onPause()
Fragmentの親Activityではない他のActivityがforegroundに出てくる時、onPauseをcallしてbackstackに入ります。(このメソッドを呼び出すのは、ユーザーがFragmentを離れるという最初の信号です。Fragmentが消滅中という意味ではないです。)
現在のユーザーがセッションを超えて持続しなければならない変更点を適用するには、ここでしなければならないです。
onStop()
Fragmentはもはや見えず、機能も果たせないです。
onDestroyView()
FragmentのViewを削除するときに呼び出される関数。もしaddするときにbackstackを使用した場合、再び該当Fragmentに戻るときにonCreateView()が呼び出されます。
onDestroy()
フラグメントを除去する直前に呼び出されます。
onDetach()
Activityの除去を完了し、Activityとの接続も解除させます。
Fragmentの種類
Activityが複数の種類を持っているように、Fragmentも基本的なFragmentクラスの他に拡張できる下位クラスがあります。
DialogFragment
Floatingダイアログを表示することができます。
このクラスを使ってダイアログを生成すると、Activityクラスのダイアログヘルパーメソッドを使用する良い手段になります。
これにより、Fragmentダイアログをアクティビティが管理するFragmentのbackstackに統合させることができ、ユーザが閉じたFragmentに戻ることができるからです。
ListFragment
アダプターが管理する項目の一覧(例:Simple Cursor Adapter)を表示。(ListActivityと類似)
このクラスは、リストビューを管理するために使用するいくつかのメソッドを提供します。
例えば、onListItemClick()コールバックを提供してクリックイベントを処理します。(リストを表示するときはListViewではなく、RecyclerViewを使用する方法が好まれます。)
この場合にはレイアウトにRecyclerViewを含むFragmentを作成しなければならない。
PreferenceFragment
オブジェクトの階層を一覧表示。
アプリケーションで設定画面を作るのに主に使われます。
Discussion