web-dev-qa-db-ja.com

ViewPagerがオフスクリーンビューを破壊しないようにする

3つのフラグメントを表示するFragmentPagerAdapterにViewPagerを接続しています。 ViewPagerは、現在の位置から複数回スワイプすると、ホストされているフラグメントのビューを破壊するように見えます。

これらのビューはすべて単純なリストであり、この最適化は完全に不要なので、無効にします。リストにはレイアウトアニメーションが適用されており、それらのアニメーションは破棄および再作成された後に再生されるため、視覚的な問題が発生します。また、毎回スクロールバーのイントロアニメーション(スクロールが可能であることを示すためにスクロールバーが短時間表示される)が表示されるため、ユーザーの現在のスクロール位置が失われます。

また、最初のスワイプが発生するまで3番目のフラグメントをロードしません。これは、各フラグメントが独自のサービスコールを処理し、アクティビティがロードされるときに3つすべてを同時に起動するため問題があります。 3番目のサービスコールを遅延させることは理想的ではありません。

ViewPagerにこの動作を停止させ、フラグメントをすべてメモリに保持するよう説得する方法はありますか?

127
chefgon

サポートパッケージの revision 4 で、デフォルトの1ではなく、使用するオフスクリーンページの数を指定できるメソッドがViewPagerに追加されました。

あなたの場合、2を指定して、3番目のページにいるときに最初のページが破棄されないようにします。逆の場合も同様です。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
321

デフォルトでは、ページをスワイプすると、ViewPagerがフラグメントを再作成します。これを防ぐには、次の2つのいずれかを試してください。

1。フラグメントのonCreate()で、setRetainInstance(true)を呼び出します。

2。フラグメントの数が固定されていて比較的小さい場合、onCreate()に次のコードを追加します。

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

私の記憶が正しければ、2番目のオプションはより有望です。ただし、両方を試して、どちらが機能するかを確認することをお勧めします。

7
Pankaj Talaviya

「アイドル状態のビュー階層の現在のページのいずれかの側に保持するページ数を設定します。この制限を超えるページは、必要に応じてアダプターから再作成されます。」

http://developer.Android.com/reference/Android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

3
Percy Vega