なんとなくこないだ入手した Master of Fragment 見てると FragmentPagerAdapter はページに対応した Fragment が存在する場合は getItem() 呼ばないとの記述があり、開発が終わったはずの某アプリに手を入れてみた。
これもダウトとのことだったのですが、画面遷移で Fragment 使いまくってたので、それらを ViewPager で表示する Fragment を getItem で new する方式に変更しつつ、画面遷移は Activity で、という修正を盛り込みました。
で、修正後に確認してみたところ、ViewPager 内で表示される Fragment から直接 startActivity してますね。Fragment から startActivity は良くない、ということで
- interface 定義して Activity で実装
- 実装なメソドから画面遷移の手続きを呼び出す
- Fragment からは getActivity() して実装なメソド呼び出し
という形を取っていて同様の方法で云々せねばならない模様なんですが、次画面に Bundle 経由で情報を渡してるのでそのあたりを吸収する必要あり。修正必要ということで備忘メモ。
つうか件の書籍によれば
- 階層的な画面遷移は startActivity() した方が良い
- 同一階層な遷移は Fragment で構わない
とのこと。あと getItem() 云々は目から鱗でした。やっぱソース読まないと駄目ですね。
追記
いくつか。
一つは Android: java.lang.SecurityException: Permission Denial: start Intent みたいなエラーが出てて訳が分からなかったのですが、Activity 追加時に自動で Android Manifest にエントリが追加されているのを知らずに自分で追加していたのが原因でした。
Activity なエントリが重複してると駄目らしいです。
もう一つ。
プロジェクトから fork して機能盛り込みをしたのですがどうやって merge すりゃ良いのか、って思っていたら fork 時点の commit から format-patch で patch 取得できるみたいですね。
これを am で盛り込めば良いのか。願わくば修正提案が了承されることを願います。