ポートレート/ランドスケープ共通の 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を使うのが吉らしい。