2015-04-06 38 views
1

視圖(在這種情況下,ViewPager s)有自己的保存和恢復狀態的實現,我依靠它來保持我的ViewPager在設備旋轉後的同一頁上。我如何讓觀點將他們的狀態保持在片段中?

當ViewPager處於活動狀態時,它工作得很好。我會滾動到一個頁面,旋轉設備,它仍然在該頁面上。 onSaveInstanceState無需代碼。

我已經將該活動轉換爲片段。現在,ViewPager不保持它的狀態!如果我滾動到頁面並旋轉設備,則返回到第1頁。

我知道我可以保存並恢復onSaveInstanceStateonCreateView中的頁面,但我寧願讓視圖自行完成特別是當我添加更多視圖並且變得更加複雜時。

如何恢復此視圖恢復碎片的功能?

這裏是我的片段:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class Dashboard extends Fragment { 

    private PagerAdapter pagerAdapter; 

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

     pagerAdapter = new PagerAdapter(getChildFragmentManager()); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dashboard, container, false); 

     // irrelevant bits removed 

     ViewPager pager = (ViewPager) view.findViewById(R.id.dashboard_pager); 
     pager.setOffscreenPageLimit(3); 
     pager.setAdapter(pagerAdapter); 

     PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) view.findViewById(R.id.dashboard_tabs); 
     tabs.setShouldExpand(true); 
     tabs.setViewPager(pager); 

     return view; 
    } 

    class PagerAdapter extends FragmentStatePagerAdapter implements PagerSlidingTabStrip.CustomTabProvider { 

     public PagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return Fragment.instantiate(getActivity(), Fragment1.class.getName()); 
       case 1: 
        return Fragment.instantiate(getActivity(), Fragment2.class.getName()); 
       case 2: 
        return Fragment.instantiate(getActivity(), Fragment3.class.getName()); 
      } 

      return null; 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "*removed*"; 
       case 1: 
        return "*removed*"; 
       case 2: 
        return "*removed*"; 
      } 

      return null; 
     } 

     @Override 
     public View getCustomTabView(ViewGroup viewGroup, int i) { 
      return getActivity().getLayoutInflater().inflate(R.layout.tab, viewGroup, false); 
     } 
    } 
} 
+1

http://stackoverflow.com/a/9646622/609782已經檢查了這個答案?如果你想在'onSavedInstanceState()'中發現你的片段是否仍然存在,你可以避免它。 除此之外,我假設你知道'android:configChanges =「orientation | screenSize」'? – Darpan 2015-04-06 03:54:47

+0

太棒了,讓我走上正軌!當我使用導航抽屜時,我不得不稍微調整它,但實質上通過標記來檢查片段,如果找不到它,則重新創建片段似乎完美地工作。謝謝!如果你做出答案,我會接受它。 – 2015-04-06 04:30:14

回答

1

Have you checked this answer?

如果你發現如果你的片段仍處於onSavedInstanceState()活着,你能避免它。

除此之外,我認爲你是知道的android:configChanges= "orientation|screenSize"

相關問題