ユーザ用ツール

サイト用ツール


fragmentメモ

Contextは継承していない

Contextを使いたい場合はgetActivity()する
onCreateViewした段階ではActivityがまだ生成されていないのでonActivityCreated以降で呼び出す

Fragmentに値を渡すときはsetArguments()

Android Fragment で setArguments() してるサンプルが多いのはなぜ?
http://y-anz-m.blogspot.jp/2012/04/androidfragment-setarguments.html

デフォルトコンストラクタをpublicにしないといけない

Activity の再生成に伴って Fragment を再生成するとき、FragmentManager はリフレクション
によってデフォルトコンストラクタを呼び出し、インスタンスを作って状態を戻そうとするので、
デフォルトコンストラクタにアクセス出来ないものはインスタンスの再生成に失敗します。
この制約から、匿名クラスを使った Fragment の取り扱いも不適切となります。

レイアウト(xml)からFragmentを生成しない

レイアウトから生成したfragmentはsetArguments()が出来ず、FragmentTransactionの対象
にも出来ない。(replaceも無理)

Android レイアウトから生成した Fragment は FragmentTransaction の対象にしてはいけない
http://y-anz-m.blogspot.jp/2012/04/android-fragment-fragmenttransaction.html

Fragment切り替え時のIllegalStateException

下記の「操作NG」の箇所でFragmentを操作しようとすると発生します。

[Fragmentライフサイクル]


↓ 操作NG

onViewCreated(Bundle savedInstanceState) 状態復元
onResume()


↓ 操作OK


onPause()
onSaveInstanceState() 状態保存

↓ 操作NG


「操作OK」の箇所で操作すれば大丈夫なように見えますが、非同期(サブスレッド)でFragmentTransacitonを取り扱ってしまったり、 そもそもFragmentTransaction#commit()が非同期であるために発生します。

FragmentのIllegalStateException回避
http://iti.hatenablog.jp/entry/2015/02/23/121110
Fragment使用時のIllegalStateException回避
http://qiita.com/nein37/items/32613e9acd9558566c5e
Fragment Transactions & Activity State Loss
http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
How to handle Handler messages when activity/fragment is paused
http://stackoverflow.com/questions/8040280/how-to-handle-handler-messages-when-activity-fragment-is-paused

FragmentTransaction#commit()はメインスレッドのHandlerにメッセージキューが積まれる

FragmentManager#beginTransaction→(FragmentManagerImpl#beginTransaction)
(Fragmentをいろいろ操作)
FragmentTransaction#commit→(android.app.BackStackRecord#commit)
(FragmentManagerImpl#enqueueAction)→(Activity#mHandlerに処理委譲)

Fragment in Fragment

FragmentでFragmentを管理するときはgetChildFragmentManager()
Fragmentから親のFragmentを取得するときはgetParentFragment()

色々ややこしくなるし管理も大変なのであまりやらないほうが良さげ。
Fragmentの中でViewPagerを使うときくらい

fragmentメモ.txt · 最終更新: 2015/07/29 09:51 by sou