2012-04-24 47 views
1

我正在使用FragmentPagerAdapter來實現選項卡式界面。我的0片段在創建時創建一個加載器,並嘗試重新連接onActivityCreated()中的加載器。下面是類:LoaderCallbacks.onLoadFinished()從來沒有用FragmentPager調用過?

public class My0thFragment extends Fragment { 
    private boolean ranOnce = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public void onActivityCreated() { 
     if (!ranOnce) { 
      // if the first time we're being created, do an initial load of data. 
      getLoaderManager().initLoader(500, null, mMyCallback).forceLoad(); 
      ranOnce = true; 
     } else { 
      // reconnect? 
      getLoaderManager().initLoader(500, null, mMyCallback); 

      // sanity check. 
      printAllLoaders(getLoaderManager()); 
     } 
    } 

    private LoaderManager.LoaderCallbacks<Foo> mMyCallback = new LoaderManager.LoaderCallbacks<Foo>() { 
     @Override 
     public Loader<Foo> onCreateLoader(int arg0, Bundle arg1) { 
      return new FooLoader(getActivity(), arg1); 
     } 

     @Override 
     public void onLoadFinished(Loader<Foo> arg0, Foo arg1) { 
      Log.e(tag, "onLoadFinished()!"); 
     } 

     @Override 
     public void onLoaderReset(Loader<Foo> arg0) { 
      Log.e(tag, "onLoaderReset()!"); 
     } 
    }; 
} 

而這裏的情景:

  1. 應用程序啓動時,在FragmentPagerAdapter創建零片段。
  2. 調用onActivityCreated()方法,該方法在第一次運行時創建並啓動加載程序。
  3. 在加載器尚未完成之前,我會快速切換到其他選項卡。
  4. 我可以看到加載器完成的日誌,但我的回調永遠不會獲得onLoadFinished()回調。我認爲這是因爲片段處於某種分離狀態,這取決於FragmentPagerAdapter的工作方式。
  5. 返回到第0個選項卡,我看到onActivityCreated()被調用,並且再次調用initLoader()方法。回調仍然不會觸發。
  6. 此時我可以在加載器管理器中打印所有加載器,並且看到我的加載器仍然位於加載器管理器中。

所以我被困在這裏,我必須做一些錯誤的事情,因爲加載器的東西一定是爲我們的開發人員設計的,以便讓我們的開發人員記住片段生命週期。任何人都可以指出我在這裏做錯了嗎?

謝謝

回答

0

請參閱從API演示或Support4Demos示例代碼文件FragmentTabsPager.java。它提供了一個ViewPager和一個TabHost來控制同一組碎片。我侵入了它,以涵蓋你所描述的情況。 (您是否直接與我聯繫?)需要注意的是,示例應用程序不會在ViewPager中分離碎片。

這裏就是我砍死它的一部分:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 

    mViewPager = (ViewPager)findViewById(R.id.pager); 

    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); 

    mTabsAdapter.addTab(mTabHost.newTabSpec("fraga").setIndicator("Fragment A"), 
      FragmentA.class, null); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("fragb").setIndicator("Fragment B"), 
      FragmentB.class, null); 

    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 

} 

片段A是包含裝載機的一個。

2

不知道你是否解決了你的問題,但你應該在Fragment.onStart()而不是Fragment.onActivityCreated()上調用forceLoad()。

myCallback.onLoadFinished()永遠不會被調用,因爲您的「myCallback」實際上並沒有附加到加載器,直到您的片段啓動。

6

也許你有相同的片段的兩個實例,試圖摧毀破壞片段裝載機:

protected void onDestroy() { 
  if (getSupportLoaderManager().getLoader(0) != null) { 
           getLoaderManager().getLoader(0).abandon(); 
           getSupportLoaderManager().destroyLoader(0); 
  } 
   super.onDestroy(); 
} 
相關問題