2011-09-16 60 views
23

我使用的是ViewPager另一個片段替換片段與FragmentPagerAdapter舉辦三種不同的片段裏面ViewPager

[Fragment1][Fragment2][Fragment3] 

我試圖做到的,是用一個全新的片段成功替代片段1在一起,片段4,如果一個特定的任務成功。

當我使用..

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.replace(R.id.fragment1_layout_id, fragment4); 
transaction.commit(); 

..the片段精美替換和Fragment4示出,而不是片段1。儘管只要我一直向Fragment3滑動,然後再回到Fragment4,Fragment1已經卷土重來。

再說,如果我用..

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.remove(fragment1); 
transaction.commit(); 

..Fragment1被刪除,我回來的時候Fragment4是存在的。因此,這種解決方案的問題是,我無法找到一個方法來立即顯示Fragment4爲片段1被刪除,即使我想:

transaction.add(fragment4); 
transaction.show(fragment4); 

這是我的FragmentPagerAdapter實現看起來像此刻,無任何交易管理

public static class PagerAdapter extends FragmentPagerAdapter { 

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

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

    @Override 
    public Fragment getItem(int position) { 

     Fragment fragment = null; 

     switch (position) { 
     case 0: 
      fragment = Fragment1.newInstance(context_); 
      break; 

     case 1: 
      fragment = Fragment2.newInstance(context_); 
      break; 

     case 2: 
      fragment = Fragment3.newInstance(context_); 
      break; 

     default: 
      break; 
     } 

     return fragment; 
    } 
} 

編輯。

所以看來我並不完全清楚我的問題。我決定刪除我之前設法創建的所有意大利麪條,並試圖說明我已將它們關閉(參見上面的粗體文字)。

反正這裏有差不多就是我一直在努力中的getItem()做:

@Override 
public Fragment getItem(int position) { 

    Fragment fragment = null; 

    switch (position) { 
    case 0: 

     if (!app.isUserLoggedIn) { 
      if (loginFragment_ == null) { 
       loginFragment_ = LoginFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (logoutFragment_ != null) { 
        transaction_.remove(logoutFragment_); 
        logoutFragment_ = null; 
       } 

       transaction_.add(loginFragment_, "login"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("login") == null) 
       fragment = LoginFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("login"); 

     } else { 
      if (logoutFragment_ == null) {      
       logoutFragment_ = LogoutFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (loginFragment_ != null) { 
        transaction_.remove(loginFragment_); 
        loginFragment_ = null; 
       } 

       transaction_.add(logoutFragment_, "logout"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("logout") == null) 
       fragment = LogoutFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("logout"); 
     } 
     break; 

    case 1: 
     fragment = HomeFragment.newInstance(context_); 
     break; 

    case 2: 
     fragment = RegisterFragment.newInstance(context_); 
     break; 

    default: 
     break; 
    } 

    return fragment; 
} 

有了這個代碼,我什麼也沒有做,但如果有人看到我在做什麼錯了,想點我在正確的方向,我會很感激!

+0

我認爲你應該在PagerAdapter中改變getItem。有返回的片段必須可見。 – pawelzieba

+0

@dziobas這就是我一直試圖去做我在我的問題中描述的魔力的地方,沒有運氣。 – velu

+0

fragment2被調用時,我點擊tab1,我不知道爲什麼tab2被稱爲?是適配器錯誤? –

回答

10

嘗試使用FragmentStatePagerAdapter

http://android-developers.blogspot.com/2011_08_01_archive.html

堂妹爲通過視圖刷卡它會刪除片段(也當你調用getItem),這樣你就不需要自己明確地刪除它們。

我一直有同樣的問題,它適用於我。

我嘗試你的代碼並刪除if (fragment!=null)塊,它的工作原理。

+0

你可以顯示一些代碼plz。我會非常感激,因爲我遵循你的步驟,我沒有得到我想要的... – cesards

0

在某些情況下,您的getItem聲明是否應該返回的fragment4?

+0

是的,它應該和我一直在試圖找出正確的方法來做這一整天。我更新了我的問題,並補充說明迄今爲止我一直在努力做到這一點。 – velu

0

嘿我已經解決了這個問題,通過使用我的FragmentPagerAdapter中的列表來處理各種片段,然後我的getItem就像這樣....

public void addScreen(String tag, Class<?> clss, Bundle args){ 
     if(clss!=null){ 
      TabInfo info = new TabInfo(tag, clss, args); 
      screens.add(info); 
     } 
    } 
@Override 
    public Fragment getItem(int position) { 
     TabInfo info = screens.get(position); 
     return Fragment.instantiate(context, info.clss.getName(), info.args); 
    } 

我再編程方式刪除/添加/重新排列列表項(片段),然後在處理程序調用

mAdapter.notifyDataSetChanged() 
3

像Maurycy說,你需要調用mAdapter.notifyDataSetChanged(),每當你想告訴ViewPager說碎片已被替換。但是,您還需要覆蓋適配器中的getItemPosition()抽象函數,並在使用舊的隱藏片段作爲參數調用時返回POSITION_NONE。否則,ViewPager將保留所有當前片段。

有關更多信息和示例代碼,請參閱this answerrelated question

0

有關如何使用ViewPagerFragmentPagerAdapter插入/替換製表符的類似問題,請參閱我的answer

0

嘗試將offScreenPageLimit設置爲5(或基於您的用例)以避免重新加載片段,以便您替換的內容將保留,而不是在滑動時重新加載。

mViewPager.setOffscreenPageLimit(5); 
相關問題