2012-11-07 8 views
18

私はFragmentPagerAdapterを持つViewPagerを持っていて、私のアプリはこれまで問題なく2つのフラグメント(異なるタイプ)しか使用していませんでした。カスタムFragmentPagerAdapterにフラグメントの破棄を通知するにはどうすればよいですか?

私はちょうど3番目のフラグメントを追加しましたが、私のアダプタ/ビューページャは、私がそれらから遠く離れたところで私のフラグメントを破壊しているようです。たとえば、私が1ページ目にいる場合、3ページ目はそれに近づくと破壊され、再作成されます。私が3ページ目にいる場合は、1ページにも同じことが起こります。

これは私のアプリで多くの問題を引き起こしています。断片はまったくRAM重ではありません。どうすればこのことが起こらないようにすることができますか?

+0

それは断片を破壊するか、ビューを破壊しますか? – DeeV

+0

わかりません。どうすれば確認できますか? –

+1

あなたは「それは多くの問題を引き起こしている」と言いました。フラグメントが破棄されている場合は、状態がメモリから消去され、リロード時にデフォルトにリセットされます。 – DeeV

答えて

43

私はあなたがViewPager.setOffscreenPageLimit()を探していると思います。

あなたのケースでは、次のことはフラグメントをメモリ内に保持し、破壊しないようにする必要があります。

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

しかし、私は破壊されたときにあなたのビューの状態を正しく保存していないと思われます。あなたの破片は、破壊/再作成に正しく対応しなければなりません。オリエンテーションが変更された場合、あなたの破片は破壊され、再作成されます。また、ユーザーがアプリケーションを離れ、システムが後でメモリを必要とし、アクティビティを破棄した場合にも起こる可能性があります。これは、以前と同じ状態で再び開くことができます。これが本当に問題の場合は、onSaveInstanceState()に状態を保存することを検討してください。保存された状態はonCreateに表示され、破損した状態と同じ状態に初期化することができます。

+0

パーフェクト!私のフラグメントをネットワークに依存しないようにするまで、これは私の一時的な解決策になるでしょう。 –

+0

これは私をとても助けました!ありがとう! – JozeRi

+1

onSaveInstanceState()はほとんどの場合呼び出されません。たとえば、1ページ目に移動し、5ページ目に移動します。最初のフラグメントはonDestroyView()を通過しますが、onSaveInstanceState()は通過しません。私の場合は少なくとも。 – natario

4

は自分のコードからsuper.destroyItem(ViewGroup container, int position, Object object);

を削除FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

でこのメソッドをオーバーライド

+0

これは、あなたのフラグメントが破棄されることを望んでいない限り(たとえFragmentPagerAdapterが有効範囲外になっても)機能します。これは問題があるかもしれませんが、状況によっては完璧です。これらの問題の状況では、あなた自身で 'destroyItem(..)'をいつも呼び出すことができます。 –

+0

このソリューションをありがとうございました:) –