3

我想保存viewpager中片段的狀態。我知道我應該這樣做:ViewPager and fragments — what's the right way to store fragment's state?。但是我使用的片段是這樣的:如何在viewpager中保存片段的狀態?

MyAdapter

class MyPagerAdapter extends FragmentStatePagerAdapter { 
     public List<String> fragmentsA; //plus 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
      fragmentsA = fragments;//plus 
     } 

     @Override 
     public Fragment getItem(int position) { 
      //return MyFragment.newInstance(); 
      return Fragment.instantiate(context, fragmentsA.get(position)); 

     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      //return CONTENT[position % CONTENT.length].toUpperCase(); 
      return mEntries.get(position % CONTENT.length).toUpperCase(); 
     } 

     @Override 
     public int getCount() { 
      // return CONTENT.length; 
      return mEntries.size(); 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

    } 

HostActivity

public static List<String> fragments = new Vector<String>(); 

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

pager = (ViewPager)findViewById(R.id.viewpager); 
adapter = new MyPagerAdapter(getSupportFragmentManager()); 
indicator = (TabPageIndicator)findViewById(R.id.indicator); 
pager.setAdapter(adapter); 
indicator.setViewPager(pager); 
pager.setCurrentItem(INITIAL_PAGE); 

//mEntries.add... 

    fragments.clear(); 
    fragments.add(Tab1Fragment.class.getName()); 
    fragments.add(Tab2Fragment.class.getName()); 
    fragments.add(Tab3Fragment.class.getName()); 
    fragments.add(Tab4Fragment.class.getName()); 

} 

我如何保存片段(fragments)說明這一點呢?我的意思是,我需要這個方法:

@Override 
protected void onSaveInstanceState(Bundle outState) { 

    super.onSaveInstanceState(outState); 
    getSupportFragmentManager() 
      .putFragment(outState, MessagesFragment.class.getName(), mMessagesFragment); 

} 

所以我應該在哪裏檢查每一個片段if (savedInstanceState != null)?我應該如何將這些碎片放入「境外」?

UPDATE 所以我把上保存狀態代碼,每個片段是這樣的:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    setUserVisibleHint(true); 
    getFragmentManager().putFragment(outState, Tab1Fragment.class.getName(), this); 
} 

回答

2

上保存狀態代碼有您使用的每個片段類裏面放。因此,對於你的情況下,它裏面:

Tab1Fragment,Tab2Fragment,Tab3Fragment & Tab4Fragment

+0

我把代碼給每一個片段(見更新的代碼),我如何使用它們現在加載狀態? –

+0

我剛剛對你發佈的鏈接進行了一次快速瀏覽,而且這個傢伙的解決方案很愚蠢,不應該使用。 onSaveInstanceState中的Bundle用於保存片段狀態的基本值(例如,滾動位置,當前選定的索引)。然後在onCreateView期間,'savedInstance'包包含您保存的所有值,您可以恢復它們。這一切都由系統爲你處理,你不應該在onSaveInstanceState期間做片段交易或設置userHint – Budius

+0

那麼你有什麼建議?如果我使用FragmentPagerAdapter而不是fragmentstatepageradapter,則所有視圖都將加載到內存中(之前已加載),因此它會記住該位置。但是,我在它們的內部有近20個帶有列表視圖的片段,並且我不能確定在同時存儲了20個片段之後的內存使用情況。這就是爲什麼我轉向使用fragmentstatepager適配器,因爲它破壞了視圖。你認爲系統能夠處理20個碎片而沒有任何堆錯誤嗎? –

相關問題