2015-03-03 42 views
1

我正在創建一個應用程序,使用viewpager在4個特定片段之間滑動。使用viewpager與特定片段

到目前爲止,我讀過的viewpager的所有例子都是在每次調用FragmentPagerAdapter的getPosition方法時創建新的片段。因此,它是這樣的:

return FragmentA.newInstance(); 

我所做的是以下幾點:

在主要活動

public static final int FRAGMENTS = 4; 
public static final String FRAGMENT_LIST ="LIST"; 
public static final String FRAGMENT_SETTINGS = "SETTINGS"; 
public static final String FRAGMENT_MAP = "MAP"; 
public static final String FRAGMENT_TICKET = "TICKET"; 

MainAdapter _adapter; 
ViewPager _pager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager() 
       .beginTransaction() 
       .add(new FragmentMap(), FRAGMENT_MAP) 
       .add(new FragmentList(), FRAGMENT_LIST) 
       .add(new FragmentTicket(), FRAGMENT_TICKET) 
       .add(new FragmentSettings(), FRAGMENT_SETTINGS) 
       .commit(); 
    } 

    _adapter = new MainAdapter(getSupportFragmentManager()); 
    _pager = (ViewPager) findViewById(R.id.pager); 
    _pager.setAdapter(_adapter); 
} 

,並在適配器:

public class MainAdapter extends FragmentPagerAdapter { 

FragmentManager _manager; 

public MainAdapter(FragmentManager fm) { 
    super(fm); 
    _manager = fm; 
} 

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

@Override 
public int getCount() { 
    return ActivityMain.FRAGMENTS; 
} 
} 

這就提出了一個異常,因爲適配器試圖更改getItem中每個片段的標籤

我的問題是:

a)每次總是使用相同的片段不正確嗎?我沒有看到使用上述方法或類似方法的示例,它們總是在getItem方法中創建一個新實例。

b)如果我希望片段具有某種持久性,那麼這是否意味着我應該存儲數據應該由每個片段在靜態變量中保存並始終創建使用這些變量的新實例?

回答

1

a)您必須在getItem()方法中創建一個新實例,每次從viewpager切換片段時都不會調用此方法。

我建議您使用您的適配器像FragmentPagerAdapter

public class MainAdapter extends FragmentPagerAdapter { 

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

@Override 
public Fragment getItem(int position) { 
      case 0 : 
       return new FragmentMap(); 
      case 1 : 
       return new FragmentList(); 
      case 2 : 
       return new FragmentTicket(); 
      case 3 : 
       return new FragmentSettings(); 
      default : 
       return null; 
} 

@Override 
public int getCount() { 
    return ActivityMain.FRAGMENTS; 
} 
} 

B)的片段如persistents,如果你在你的ViewPager切換幾個片段,他們將只重新創建。例如,如果您不想在您的案例中重新創建片段,則可以將刷新限制設置爲_pager.setOffscreenPageLimit(3);

欲瞭解更多信息:http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

+0

我試過,問題是,當我使用FragmentPagerAdapter時,我得到一個錯誤,說該視圖已經有一個父,但它與FragmentStatePagerAdapter一起工作,但後來我的問題是,只要我瀏覽出特定片段,刪除,所以我不能用它說getSupportFragmentManager()。getFragments()。get(0); 這是我需要的,因爲將來每個fargment都會與父級活動進行通信並向其發送消息,該活動將用於更新其他片段 – Cruces 2015-03-03 13:10:52

+0

對不起,我沒有注意到您的setOffScreenPageLimit評論,我將嘗試,謝謝 – Cruces 2015-03-03 13:13:31

+0

我也建議你使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。 – Bubu 2015-03-03 13:27:53

0

a)我認爲這很完美。他們總是創建ne實例,因爲它更容易,並且在很多情況下(比如圖片庫)更好。

b)如果您將應用程序發送到後臺然後返回,靜態變量會丟失。共享的prefferences或捆綁應該做的工作。

+0

所以如果我創建的線沿線的一個構造函數: 公共MainAdapter(FragmentManager FM,列表片段) ,然後使用getItem()時,從列表中返回一個特定的項目,它不應該是一個問題? 當你說將變量保存到一個包中時,如果我將片段列表保存到包中然後從OnCreate中提取它們,它會不正確嗎? – Cruces 2015-03-03 13:18:45

0

您應該使用FragmentStatePagerAdapter。如果您使用fragmentstatepager適配器,則可以動態刪除或添加片段。