2014-02-09 52 views
0

我正在使用'一旦用戶離開時銷燬所有活動'來模擬操作系統殺死我的應用程序來測試我的應用程序。無法理解FragmentPagerAdapter在活動破壞下的工作方式

在我的主要活動,在的onCreate,我實例的所有片段,將它們添加到列表,然後:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), fragments); 
mViewPager = (ViewPager) super.findViewById(R.id.pager); 
mViewPager.setAdapter(mSectionsPagerAdapter); 

下面是適配器代碼:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> fragments; 

    public SectionsPagerAdapter(FragmentManager fragmentManager, List<Fragment> fragments) { 
     super(fragmentManager); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: return getString(R.string.section_one); 
      case 1: return getString(R.string.section_two); 
      case 2: return getString(R.string.section_three); 
      case 3: return getString(R.string.section_four); 
     } 

     return null; 
    } 
} 

現在的問題(崩潰)在這裏,在一個動作欄項目:

case R.id.action_refresh: 
    PostsFragment fragment = (PostsFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem()); 
    fragment.reloadDataFromServer(); 

說活動被打開,然後在後面銷燬b utton。當我返回到此活動並按刷新操作項目時,應用程序崩潰。爲什麼?當再次創建活動時,它會創建一個新的尋呼機適配器,幷包含所有新的4個片段。但是創建這些片段永遠不會被調用,所有成員都不會被初始化,所以reloadDataFromServer無法加載到尚未初始化的列表視圖中。然而,我們不再有對它們的引用,因爲我們用新的片段重新創建了FragmentPagerAdapter。但是我們不再引用它們,因爲我們用新的片段重新創建了FragmentPagerAdapter。這讓我瘋狂!爲什麼onCreate沒有調用新的片段?

回答

0

如果有人有這個問題,我會解釋我的解決方案。基本上會發生什麼是在破壞之後恢復活動的重新創建之前創建的碎片。對於你們中的一些人來說,這可能是一個時刻時刻。

我的問題實質上是不正確的引用片段。

首先,我將setOffscreenPageLimit更改爲完整(#tabs - 1)。這意味着所有片段都在開始時創建並保存在內存中。我會解釋爲什麼這有助於以後。

這意味着在onSaveInstanceState中,我們可以在outState Bundle中對所有4個片段使用putFragment。

在create中,如果savedInstanceState爲null,我們可以從頭創建所有4個片段。否則,您可以在所有4個片段上使用getFragment,並將它們放入新的尋呼機適配器中作爲參考。

您可能會問爲什麼我將setOffscreenPageLimit設置爲max。我在確定使用putFragment保存哪些片段時遇到了問題。 isAdded()看起來並不總是正常工作,isResumed()也不是,所以將它們全部保存起來更容易,因爲我們知道所有4個都是創建的並且始終在片段管理器中。