ViewPagerが画面外のビューを破棄しないようにする


133

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

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

また、最初のスワイプが発生するまで3番目のフラグメントは読み込まれません。これは、各フラグメントが独自のサービス呼び出しを処理し、アクティビティが読み込まれるときに3つすべてを同時にオフにしたいため問題です。3番目のサービス呼び出しを遅延させることは、理想的とは言えません。

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

回答:


332

改訂4サポートパッケージの、方法ではなく1でデフォルトよりも、あなたが使用するオフスクリーンページ数を指定することができますViewPagerに追加されました。

あなたのケースでは、2を指定したいので、3ページ目にいるとき、最初のページは破棄されず、その逆も同様です。

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

カバーフローでこれを行う方法はありますか?
josephus

4
こんにちは。私が取り組んでいることでは、フラグメント/ページが動的に作成されるため、不確かな数のフラグメントが存在する可能性があります。この場合、通常は10以下になります。この多くのページにこのソリューションを使用することは、メモリの不十分な使用ではないでしょうか?ちなみに、フラグメントはビューのみを保持します。ありがとう!
mahkie 2012

このメソッドは、「java.lang.IllegalStateException:Fragment already added:」エラーをスローします。
アリカンバトゥール2014

どうもありがとう。本当にうまくいきました。私も@chefgonのような同じ問題がありました。
Prashant、2015

@mahieこれが最適化として提供されている場合の上記のソリューション。サポートする必要があるページ数が事前にわかっている場合、またはページ上に遅延読み込みメカニズムを*備えている場合、この設定を微調整すると、ページングアニメーションとインタラクションの*スムーズさを認識できるようになります。少数のページ(3〜4)*を同時にアクティブに保つことができる場合、ユーザーページが前後に移動するため、*新しく作成されたビューサブツリーのレイアウトに費やされる時間が短くなります
Asthme

8

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

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

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.