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再生成は阻止できない (android:configChanges="orientation|screenSize" などをしても再生成する)
Activity再生成で、Staticでない変数などは全て消えてしまう (Static変数は残る)
Activity#onCreate(Bundle) 以降の初期化処理が再度動作する
Activity#onCreate では初期化処理などをするが、そうなるとStatic変数は残ったとしても自主的に初期化してしまいかねない。そこで、Activity#onCreate() でも対策が必要である。
Activity#onCreate(Bundle savedInstanceState) 内では、savedInstanceState == null の場合のみ初期化処理を実施するようif文を追加
非Activityクラスなどは、このif文内でnewしてStatic変数にインスタンスを保存するようにする
if文のあとで、Fragmentでの画面作成(タブの追加など)は、初回でも再生成でも同様に実施する
レイアウト
レイアウトの設定は、Fragmentを使わないActivityのみの従来型Androidアプリと全く同じである。
AndroidではレイアウトはXMLとして書いて保存するが、縦画面と横画面で切り替えたい需要は、Activityのみの場合と同様に生じるだろう。対応方法もActivityのみの場合と同じである。
/res/layout だけに置くと、縦画面でも横画面でも同じものが使われる (これが標準)
/res/layout-port と /res/layout-land に置くと、縦画面は /res/layout-port が、横画面は /res/layout-land が使われる
/res/layout と /res/layout-land に置くと、縦画面は /res/layout が、横画面は /res/layout-land が使われる
一般には、横画面用に独自のレイアウトを作りたい場合が多いと見込まれるため、3番目の例で対応することが多いと見込まれる。
プログラムの中で、getResources().getConfiguration().orientation で方向を受け取ったり、Activityのwidth/heightを受け取って比較して判断したりしてレイアウトを切り替えることも可能だが、一般にはこれは冗長な方法である。
再検索