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