閉じる

ViewPagerのキャッシュ

ポートレート/ランドスケープ共通の Layoutに ViewPagerを配置し、端末の向きによって食わせるFragmentStatePagerAdapterを切り替えていた。

で、端末の回転をさせると回転前の Fragmentを表示しようとする。

結果、inflateしているレイアウトが異なるのでイヤ~ンな事になる。

ページを切り替えていき、新たな Fragmentを作成する必要になった時点で回転後の Fragmentが作成され、期待した表示になる。

ViewPagerが Fragmentをキャッシュしていて、期待しているタイミングで破棄されない感じ。

調べてみると、ViewPagerは ID事にキャッシュを行っているらしい…ViewPagerが違っていれば大丈夫?

というわけで、ポートレート/ランドスケープで ViewPagerの IDだけが異なる Layoutを作成し、ViewPagerの IDによって FragmentStatePagerAdapterを切り替えるように変更。

結果、回転後に回転前の Fragmentを表示しようとするの自体は変わらないけど、そもそも表示している ViewPagerが異なるので期待した表示に。*1

もっと根本的な解決方法がある気もするけど、今は逃げで。

2013/09/03追記

結局、丸ごと Fragmentに押し込め、毎回 replaceすることで最終的な解決とした。

2013/09/13追記

PhotoViewPager(というか、ソレを使ったサンプルか)ではうまくやっているので何か方法があると思って調べてみたら、FragmentStatePagerAdapterや FragmentPagerAdapterは内部的には単純に「position番目の Fragment」を管理しているだけなのに対し、PhotoPagerAdapterは PagerAdapterを直接実装し、N番目に表示する内容から識別子を生成していた。
結果、ポートレート/ランドスケープで表示する内容*2 が異なっているのでちゃんと別物として認識してくれたと。
結論: FragmentStatePagerAdapterや FragmentPagerAdapterをそのまま使ったのでは基本的に回避不可。

2013/09/20追記

どうやら、Fragmentで包んで、Fragment#getChildFragmentManagerを使うのが吉らしい。


*1 当然、回転前の Fragment表示がエラーで落ちたりしないようにする必要はある。

*2 実際には URI

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)