[英]Restoring Fragment Instance with references
簡短版:我想知道當片段包含對無法序列化或復制且需要保留在內存中的對象的引用時,如何重新創建片段狀態(例如,在屏幕旋轉之后)。
較長的 版本:在我的應用程序中,我使用連接到自定義FragmentPagerAdapter的ViewPager ,該InstanceInstantiate實例化許多片段,這些片段顯示ListView中包含的數據(日程表)。 所有這些都包含在父片段中。 當由適配器實例化時,每個頁面片段都將傳遞一個對執行多個操作的單個對象(“ ScheduleManager ”)的引用:
本質上, ScheduleManager將所有內容組合在一起,並實現了我的應用程序的這一部分(“時間表”)的主要邏輯,即加載和提供數據,以及通過ActionMode修改和重新定義它的方法 。 我不知道這是不是很好的設計...
我的問題是在這種情況下應該如何還原Fragments實例狀態? 我無法將ScheduleManager序列化為一個包,因為它將松開對Context和LoaderManager的引用(否則,我當然會使用setArguments / getArguments )。 另外,所有頁面片段都必須引用ScheduleManager的相同實例,否則共享操作模式將不起作用。 除此之外,我不想每次還原片段時都復制整個計划數據。 我想將該對象保留在內存中,並讓頁面片段在還原時回收對其的引用。
我想我可以讓包含的活動保存ScheduleManager並讓PageFragment查詢它作為參考。 但是,如果可能的話,我寧願將父片段中的所有內容保持獨立且模塊化(不同項目的時間表可能不同)。 雖然我在寫這篇文章的時候感覺到這是沒有辦法的。
當然,當重新創建父片段時,它也可以重新創建ScheduleManager並向其提供所需的引用( Context + LoaderManager )。 問題是父片段的每個實例最多只能有一個ScheduleManager實例,因此如何使嵌套的頁面片段重新連接到它。
這是我最終要做的事情:
public void onCreate(Bundle savedInstanceState)
{
Fragment fragment = this.getActivity().getFragmentManager().findFragmentByTag("SCHEDULE");
if (fragment instanceof ScheduleMasterFragment)
{
ScheduleMasterFragment master = (ScheduleMasterFragment) fragment;
this.scheduleManager = master.getScheduleManager();
}
else
{
throw new RuntimeException("SchedulePageFragment must be " +
"the child of a ScheduleMasterFragment with Tag set to 'schedule'");
}
super.onCreate(savedInstanceState);
}
ScheduleManager是我要保留的參考。 至少以這種方式,我將所有代碼保留在片段本身內,除了ScheduleMasterFragment
中的getScheduleManager
,這是有意義的,因為ScheduleMasterFragment
某種程度上是ScheduleManager實例的所有者。
仍然歡迎任何更好的解決方案...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.