簡體   English   中英

使用參考還原片段實例

[英]Restoring Fragment Instance with references

簡短版:我想知道當片段包含對無法序列化或復制且需要保留在內存中的對象的引用時,如何重新創建片段狀態(例如,在屏幕旋轉之后)。

較長的 版本:在我的應用程序中,我使用連接到自定義FragmentPagerAdapterViewPager ,該InstanceInstantiate實例化許多片段,這些片段顯示ListView中包含的數據(日程表)。 所有這些都包含在父片段中。 當由適配器實例化時,每個頁面片段都將傳遞一個對執行多個操作的單個對象(“ ScheduleManager ”)的引用:

  • 包含要顯示的數據
  • 持有對Context對象的引用(以訪問SharedPreferences
  • 保留對父片段LoaderManager的引用,以便它可以重新加載數據
  • 實現OnClickActionMode回調偵聽器(以能夠創建和處理適用於所有頁面的動作模式;頁面片段將對象作為偵聽器添加到其ListViews中)
  • 定義一個回調接口,以通知偵聽器狀態更改或何時重新加載數據(頁面片段將自己注冊為偵聽器)。

本質上, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM