0

交換片段我有3個片段一個ViewPager和我的FragmentPagerAdapter:在viewpager

private class test_pager extends FragmentPagerAdapter { 
    public test_pager(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     return fragments[i]; 
    } 

    @Override 
    public long getItemId(int position) { 
     if (position == 1) { 
      long res = fragments[position].hashCode()+fragment1_state.hashCode(); 
      Log.d(TAG, "getItemId for position 1: "+res); 
      return res; 
     } else 
      return fragments[position].hashCode(); 
    } 

    @Override 
    public int getCount() { 
     return fragments[2] == null ? 2 : 3; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     Fragment fragment = (Fragment) object; 
     for (int i=0; i<3; i++) 
      if (fragment.equals(fragments[i])){ 
       if (i==1) { 
        return 1; // not sure if that makes a difference 
       } 
       return POSITION_UNCHANGED; 
      } 

     return POSITION_NONE; 
    } 
} 

在頁面中的一個(#1),I是不斷變化的要被顯示的片段。我刪除舊片段的方法是這樣的:

FragmentManager fm = getSupportFragmentManager(); 
fm.beginTransaction().remove(old_fragment1).commit(); 

然後就是改變我發現,我真的不能addreplace新的一個或它會抱怨的ViewPager嘗試的fragments[1]

值要添加它也與另一個標籤...(我在這裏做錯了什麼?)

我顯示的所有片段都有setRetainInstance(true);onCreate函數。

我的問題是,這通常適用於前幾個替換,但後來當我嘗試重用一個片段,有時(我沒有真正想出了模式,相同的片段可能會顯示多次,然後纔會發生這種情況)它只會顯示一個空白頁面。

以下是我已經找到了我的片段的回調函數發生了,我想,當問題發生,以顯示:

  • onAttach被稱爲(但在那個時候,getView仍然是空)
  • onCreateView不叫(這是預期)
  • onViewStateRestored不叫(爲什麼不呢?)
  • onResume不叫(我真的認爲它會...)

如果它改變任何東西,我使用的是支持包,我的活動是一個SherlockFragmentActivity

編輯(回答Marco的評論):

的片段中的中的onCreate函數實例活動,我填一個ArrayList與那些片段:

char_tests = new ArrayList<Fragment>(Arrays.asList(
      new FragmentOptionA(), new FragmentOptionB(), new FragmentOptionC())); 

的我從列表中選擇設置fragments[1](這是所有在UI線程中完成)

+0

其中是創建的片段? –

+0

@Marco在Activity的onCreate函數中,我填充了這些片段的ArrayList。我在問題 – Matthieu

+0

中添加代碼管理碎片的方式有點奇怪。結帳這個問題似乎與你的問題有關。 http://stackoverflow.com/questions/7951730/viewpager-and-fragments-whats-the-right-way-to-store-fragments-state?rq=1 –

回答

0

我通過改變test_pager改爲FragmentStatePagerAdapter來解決這個問題。

根據使用情況,我仍然對PagerAdapter應該使用什麼感到困惑。我可以在文檔中找到的唯一信息是,FragmentPagerAdapter對於保存在內存中的較小頁數會更好,並且FragmentPagerStateAdapter對於更多頁面會更好,因爲它們會被破壞並節省內存。

When試圖用Fragments做(花哨?)的東西,我發現FragmentStatePagerAdapter比在這種情況下刪除和重新插入頁面更好。當頁面移動位置時,FragmentPagerAdapter更好(請參閱bug 37990