2017-05-21 13 views
0

私はフラグメントをインスタンス化してgetItem()メソッドでそれを返すアダプタを備えたviewPagerを持っています。だから私は最初のページに私はわずか2つの断片が生きている。私は電話機を回転させると、それらは破壊されてガベージコレクトされます(システムはonDestroy()とonDetach()をコールし、ガベージコレクションの準備として.hprofメモリダンプでそれらを見ることができます)。しかし、何らかの理由で新しいビューページと2つの新しいフラグメントで新しいアクティビティが作成されると、システムは以前に破棄されたものに対して2つのフラグメントを作成し、アクティビティにアタッチします。彼らはfragmentManagerのmActiveとmAdded配列に座っているだけです。デバイスを数回回転させると、毎回新しいインスタンスが作成されます。今、これは破片がゴミ収集されないようにする漏れのように思えるかもしれませんが、実際にはそうです。これらのフラグメントはすべて、異なる@xxx番号を持ち、新しいフラグメントマネージャ内の新しいアクティビティにアタッチされます。私はすべてを試しました、どんな助けや提案も感謝しています、ありがとう!フラグメンテーションと自分自身でのアクティビティの追加

+0

これは、ViewPagerの動作方法です。あなたの質問は何ですか? – Juan

+0

よく私は同様の方法で使用する他のviewPagesを持っています、そして、彼らはそれをしません。表示されているフラグメントとその隣にあるフラグメントだけが常に存在します。しかし、私は携帯電話を回転させると、それらはすべて破壊され、再作成されません。つまり、viewPagerは、画面の回転ですべてのフラグメントを破棄する必要があるため、おそらく期待どおりに動作します。私はちょうどundestをしないでくださいなぜ彼らは目的なしに再作成されている –

答えて

1

ViewPagerは、それが示すフラグメントのライフサイクルを処理します。あなたが言及しているように、時間が来たらスムーズにスワイプできるように、目に見えるフラグメントとそれの隣にあるもの(FragmentStatePagerAdapterと一緒に使用される場合)を作成します。フラグメントが見えなくなったら、その意志でViewPagerによって破壊され再現されます。

回転スクリーンのデフォルトのビヘイビアは、アクティビティがViewPagerFragmentsと共に再作成されていることです。 これは変更できます。 android:configChanges="orientation"をマニフェストで使用すると、方向変更時に再作成されることを防ぐことができます。 方向変更時にフラグメントインスタンスを保存するもう1つの方法は、保持するフラグメント内のsetRetainInstance(true)を呼び出すことです。

+0

まあ私の場合はほとんど何が起こる。私は最初のページを見て、私は画面を回転させる。活動が破壊され、断片が破壊される。新しいフラグメントマネージャーで作成された新しいアクティビティーと、新しいアダプターで新しいビューパーガー。現在、フラグメントマネージャは2つの新しいフラグメントを作成し、それらをアクティビティとviewPagerのアダプタに追加します。これまでのところうまくいきましたが、FragmentManagerは2つのフラグメントをさらに作成し、ビューページのアダプタに追加することなくそれらをアクティビティにのみ添付します。今度は4つの断片があります。私が再び回転すると、2つの正常な断片と4つの断片が作成されます。 –

+0

断片の古い破棄されたインスタンスは見ていませんか? – Juan

+0

私はこの断片のonCreateViewにbreakpiontを入れました。最初に私は2度呼ばれる活動に入る。最初の回転の4回後、次に6回の回転の後など。これらの断片は捨てられる。彼らの場所では、常に同じ数のクレタートが追加され、さらに2つが追加されてユーザーに表示されます –

0

私はそれが(予期せず:D)悪いコードでした。 ActivityのonRestoreInstanceState()に、新しいアダプタを作成して設定していたコードがあり、古いフラグメントがバックグラウンドに置かれていました。答えられない質問で迷惑を掛けて申し訳ありません。

関連する問題