2014-09-30 67 views
0

我有一個TabsPagerAdapter類延伸FragmentPagerAdapter。我用它來填充3個選項卡。所有三個視圖都是碎片。片段onCreateView不叫

這是它們是如何定義的

public class DonorSearchFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class DonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class CampDonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

這些片段(如標籤)從TabsPagerAdapter實例如下面

public class TabsPagerAdapter extends FragmentPagerAdapter { 

    private ArrayList<Fragment> fragments; 

    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     fragments = new ArrayList<Fragment>(); 
     fragments.add(Constants.SEARCH_TAB_POSITION, new DonorSearchFragment()); 
     fragments.add(Constants.DONORS_TAB_POSITION, new DonorResultsFragment()); 
     fragments.add(Constants.CAMP_DONORS_TAB_POSITION, new CampDonorResultsFragment()); 
    } 
    ... 
} 

和在MainActivity,我實例化TabsPagerAdapter類如上所示

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, DonorSearchFragment.ResultsChangedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     tabsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(tabsPagerAdapter); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 
     .. 
    } 
} 

令人驚訝的是,即使在如上所述的實例化之後,第三個選項卡(即CampDonorResultsFragment)onCreateView()也沒有被調用。因此,如果我調用該片段上的任何方法,則所有變量(在onCreateView())中實例化爲空,並且我得到空指針異常。

這裏發生了什麼,爲什麼onCreateView()沒有被手動調用該片段上的任何方法之前調用。另外,爲什麼在上面的第二個選項卡(DonorResultsFragment)上不會發生這種情況。

+0

完全發佈'TabsPagerAdapter'! – mmlooloo 2014-09-30 05:32:10

回答

2

查看傳呼機只保留當前頁面,再加上由off-screen page limit指定,默認爲1

多項一個/下一個頁面的考慮重新設計你的代碼,以便它不承擔您的片段是在活着一直。而不是調用片段上的方法,使片段在需要的地方提取所需的數據。

作爲一個快速解決方案,您可以將頁面限制設置爲更高的數字(如2),但不能解決最終會將您咬在其他位置的基礎設計問題。

+0

你是對的,setOffscreenPageLimit()確實有效。然而正如你所說的,你應該避免在MainActivity中調用片段上的方法。在我的情況下,我仍然試圖找出相同的。通常,片段生成一些數據並將其傳遞給MainActivity的方式是,然後將MainActivity傳遞給其他片段。 – Jatin 2014-09-30 05:47:29

+0

爲此,您可以使用各種事件總線(例如Otto)來分離數據生產者和消費者。 – laalto 2014-09-30 05:54:43