ViewPager メモ

備忘録。

Android の ViewPager は、単純な使い方ならかなり簡単でかつ便利なんだけど、ちょっと複雑なことをしようとすると、とたんにトラップが牙を剥く。

1.一度表示させた Fragment を取り替えることができない

例えば、3 ページ持つ ViewPager があったとする。
1 ページ目の入力で 2 ページ目に表示させる Fragment を動的に変える、というようなことが難しい。
表示を変えることはできるが、一度表示させた Fragment は ViewPager 内でキャッシュされ、またキャッシュされた Fragment を開放する方法を ViewPager が提供していないためである。

2.スワイプさせて表示した Fragment 内の View#onMeasure(int, int) が呼び出されない

ViewPager は初期状態で、setCurrentItem(int) で設定されたページと左右両隣のページの Fragment を要求し、このタイミングで生成された Fragment 内の View#onMeasure(int, int) は適切に呼び出される。ただし、指でスワイプしたり、後から setCurrentItem(int) などで違う Fragment を表示させる場合において、何故か View#onMeasure(int, int) が呼び出されない。

View#onMeasure(int, int) は、カスタム View を作る際にお世話になるメソッドで、場合によっては必要不可欠だったりするんだけど、ViewPager では機能しないため、対策が必要になる。

最もわかりやすい対策は、初期表示でなら適切にレイアウトされるので、まずすべてのページを初期状態で表示させ、その際使用した View をキャッシュしておき、改めて本番でそれらを使う、というものだ。キャッシュをどのように行うかがキモなんだけど、親 Activity などに持たせるのが賢明なんだと思う。