5

Fragmentこの問題について事前に検索しておくと、選択したを動的に追加および削除することに関する多くの議論を見つけることができますViewPager。ただし、ここで実際に懸念しているのは、を介してsを表示するために使用された場合に、プログラムでViewPager「クリーン」全体をその内容から削除し、含まれているが適切に破棄されるようにする方法です。ViewGroupViewPagerFragmentFragmentPagerAdapterFragment

質問をもう少し詳しく説明するためFragmentに、左側のリストから選択を行い、選択したコンテンツを右側のの右側に配置する、横向きの2ペインレイアウトを使用しFrameLayoutます。重要なのは、コンテンツがページ化されている場合とされていない場合があるということです。したがって、コンテンツはViewPagerフォーマットで表示する必要があります。または、ページが表示されていない場合は、単一でFragment直接表現する必要があります。

シングルを表示するために、コンテナに配置するために通常どおりにをFragment実行します。一方、表示されるのがページ化されたコンテンツである場合は、代わりにを作成し、の子として追加します。FragmentTransactionFragmentFrameLayoutViewPagerFrameLayout

コンテンツを変更する必要がある場合、前のコンテンツがスタンドアロンの場合は、Fragmentを使用して簡単に削除できますFragmentTransaction .remove()。これを行うと、期待どおりFragmentonPause()...onDestroy()サイクルが実行されます。前のコンテンツがaだった場合は、 usingViewPagerから削除します。ここで問題が発生します。を介してその中に保持されていたのいずれかで呼び出されている...メソッドが表示されません。FrameLayout.removeAllViews()onPause()onDestroy()FragmentViewPagerFragmentPagerAdapter

ユーザーの観点からは、アプリケーションは正常に動作します。数ラウンドViewPager削除した後、GCがメモリを再利用しているのを見ることができます。ただし、それらFragmentのメソッド内でクリーンアップを実行できないため、これらのエンドオブライフメソッドが呼び出されないという事実は気に入らず、「正しくない」ように見えます。

おそらく、が親から切り離されたときにViewPager'sを削除するためにフックできる方法はありますか?つまり、が使用されなくなったことがわかったら、どこか(おそらく)でsを実行して、それらのsを削除します。FragmentViewPagerViewGroupFragmentTransactionFragmentPagerAdapterFragment

ViewPagerあるいは、右側を永続的に維持し、その中のを動的に交換できることに気付きFragmentました。もちろん、特定の時間に1ページしか保持されないことは問題ではありません。これがより良い方法である場合は、コードをリファクタリングしてこれを実行しますが、意見をいただければ幸いです。

4

1 に答える 1

12

ただし、フラグメント内でクリーンアップを行うことができないため、これらのフラグメントの寿命が尽きるメソッドが呼び出されないという事実は気に入らず、「正しく」ないようです。

アクティビティが破棄されたときにクリーンアップする必要があります (ヒープの問題などで手遅れでない場合)。

つまり、ViewGroup が使用されなくなったことがわかったら、FragmentTransactions をどこか (おそらく FragmentPagerAdapter 内) で実行して、それらの Fragment を削除します。

そこにフラグメントを配置するトランザクションを実行しませんでした。したがって、フラグメントを削除するトランザクションを簡単に実行することはできません。に切り替えてFragmentStatePagerAdapterを呼び出すとsetAdapter(null)、ソース コードを読むことで、ページャー内の既存のすべてのフラグメントが破棄されるはずです。はそのメソッドから をFragmentPagerAdapter使用することはありませんが、使用しremove()、新しいアダプター (または) が に提供されると、現存するすべてのフラグメントが破棄されます。FragmentStatePagerAdapterdestroyItem()destroyItem()nullsetAdapter()

于 2012-10-07T11:04:11.630 に答える