我有一个 TabsPagerAdapter 类,它扩展了 FragmentPagerAdapter 。我用它来填充3个标签。所有这三个视图都是碎片。
这是他们的定义方式
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()。因此,如果我调用该Fragment上的任何方法,所有变量(在 onCreateView()中实例化)都为null,并且我得到空指针异常。
这里究竟发生了什么,为什么在手动调用该Fragment上的任何方法之前未调用 onCreateView()。另外,为什么不在上面的第二个标签(DonorResultsFragment)上发生这种情况。
答案 0 :(得分:2)
查看寻呼机仅保留当前页面,以及off-screen page limit指定的多个上一页/下一页,默认为1。
考虑重新设计您的代码,以便它不会假设您的片段始终处于活动状态。不是在片段上调用方法,而是让片段在任何可用的地方提取所需的数据。
作为一个快速解决方案,您可以将页面限制设置为更高的数字,例如2,但这不会解决最终会让您陷入其他地方的基础设计问题。