Fragment
読み:フラグメント
外語:Fragment

 Androidアプリケーションのユーザーインターフェイスを管理し、Activityの中に組み込めるコンポーネントでありオブジェクト。
目次

概要
 タブレットコンピューターの広い画面に対応するために、Android 3.0(Honeycomb、APIレベル11)から追加された。
 Android 3.xはタブレット専用だが、Android 4.0(Ice Cream Sandwich)以降はスマートフォンでも利用できるため、以降はFragmentを利用したアプリケーションが一般化している。

特徴

ライフサイクル
 Fragmentも、Activityと同様に状態遷移図にある通りに状態遷移して機能する。
 Androidでは、この状態遷移を「ライフサイクル」と呼んでいる。

再生成
 FragmentはActivityのライフサイクルに依存するため、Activityが再生成される際にはFragmentも再生成される。
 通常状態では、画面回転などで状態が変わると「ActivityおよびFragmentのインスタンスを破棄→ActivityおよびFragmentを再生成」と動作する。
 これは、縦横でレイアウトを変える必要がある(ことがある)ためで、JavaのプログラムではActivityおよびFragmentのonCreate()から再度やり直しとなる。
 Fragmentを用いたアプリの開発で回転時にActivityを破棄させないためには、onCreate()の早い段階で、以下を実行しておく必要がある。
 setRetainInstance(true);
 Fragment#setRetainInstance() を用いると、onCreate() や onDestroy() は呼ばれなくなる。但し、onDetach() や onAttach() や onCreateView() は呼ばれる。
 この方法ではFragmentが再生成されないだけでActivityは再生成されるので、困る場合はActivity側の対策も必要である。
 具体的には、次のような現象が生じる。
 Activity#onCreate では初期化処理などをするが、そうなるとStatic変数は残ったとしても自主的に初期化してしまいかねない。そこで、Activity#onCreate() でも対策が必要である。

レイアウト
 レイアウトの設定は、Fragmentを使わないActivityのみの従来型Androidアプリと全く同じである。
 AndroidではレイアウトはXMLとして書いて保存するが、縦画面と横画面で切り替えたい需要は、Activityのみの場合と同様に生じるだろう。対応方法もActivityのみの場合と同じである。
  1. /res/layout だけに置くと、縦画面でも横画面でも同じものが使われる (これが標準)
  2. /res/layout-port と /res/layout-land に置くと、縦画面は /res/layout-port が、横画面は /res/layout-land が使われる
  3. /res/layout と /res/layout-land に置くと、縦画面は /res/layout が、横画面は /res/layout-land が使われる
 一般には、横画面用に独自のレイアウトを作りたい場合が多いと見込まれるため、3番目の例で対応することが多いと見込まれる。
 プログラムの中で、getResources().getConfiguration().orientation で方向を受け取ったり、Activityのwidth/heightを受け取って比較して判断したりしてレイアウトを切り替えることも可能だが、一般にはこれは冗長な方法である。

再検索