この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| 
                    fragmentメモ [2015/06/05 09:49] sou  | 
                
                    fragmentメモ [2015/07/29 09:51] (現在) sou  | 
            ||
|---|---|---|---|
| ライン 1: | ライン 1: | ||
| === Contextは継承していない === | === Contextは継承していない === | ||
| Contextを使いたい場合はgetActivity()する\\ | Contextを使いたい場合はgetActivity()する\\ | ||
| - | onCreateViewした段階ではActivityがまだ生成されていないのでonActivityCreated以降で呼び出す | + | onCreateViewした段階ではActivityがまだ生成されていないのでonActivityCreated以降で呼び出す\\ | 
| - | \\ | + | |
| \\ | \\ | ||
| === Fragmentに値を渡すときはsetArguments() === | === Fragmentに値を渡すときはsetArguments() === | ||
| Android Fragment で setArguments() してるサンプルが多いのはなぜ?\\ | Android Fragment で setArguments() してるサンプルが多いのはなぜ?\\ | ||
| - | http://y-anz-m.blogspot.jp/2012/04/androidfragment-setarguments.html | + | 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を使うときくらい\\ | ||
| + | \\ | ||