Fragmentこの問題について事前に検索しておくと、選択したを動的に追加および削除することに関する多くの議論を見つけることができますViewPager。ただし、ここで実際に懸念しているのは、を介してsを表示するために使用された場合に、プログラムでViewPager「クリーン」全体をその内容から削除し、含まれているが適切に破棄されるようにする方法です。ViewGroupViewPagerFragmentFragmentPagerAdapterFragment
質問をもう少し詳しく説明するためFragmentに、左側のリストから選択を行い、選択したコンテンツを右側のの右側に配置する、横向きの2ペインレイアウトを使用しFrameLayoutます。重要なのは、コンテンツがページ化されている場合とされていない場合があるということです。したがって、コンテンツはViewPagerフォーマットで表示する必要があります。または、ページが表示されていない場合は、単一でFragment直接表現する必要があります。
シングルを表示するために、コンテナに配置するために通常どおりにをFragment実行します。一方、表示されるのがページ化されたコンテンツである場合は、代わりにを作成し、の子として追加します。FragmentTransactionFragmentFrameLayoutViewPagerFrameLayout
コンテンツを変更する必要がある場合、前のコンテンツがスタンドアロンの場合は、Fragmentを使用して簡単に削除できますFragmentTransaction .remove()。これを行うと、期待どおりFragmentにonPause()...onDestroy()サイクルが実行されます。前のコンテンツがaだった場合は、 usingViewPagerから削除します。ここで問題が発生します。を介してその中に保持されていたのいずれかで呼び出されている...メソッドが表示されません。FrameLayout.removeAllViews()onPause()onDestroy()FragmentViewPagerFragmentPagerAdapter
ユーザーの観点からは、アプリケーションは正常に動作します。数ラウンドViewPager削除した後、GCがメモリを再利用しているのを見ることができます。ただし、それらFragmentのメソッド内でクリーンアップを実行できないため、これらのエンドオブライフメソッドが呼び出されないという事実は気に入らず、「正しくない」ように見えます。
おそらく、が親から切り離されたときにViewPager'sを削除するためにフックできる方法はありますか?つまり、が使用されなくなったことがわかったら、どこか(おそらく)でsを実行して、それらのsを削除します。FragmentViewPagerViewGroupFragmentTransactionFragmentPagerAdapterFragment
ViewPagerあるいは、右側を永続的に維持し、その中のを動的に交換できることに気付きFragmentました。もちろん、特定の時間に1ページしか保持されないことは問題ではありません。これがより良い方法である場合は、コードをリファクタリングしてこれを実行しますが、意見をいただければ幸いです。