Android 未调用片段onCreateView

Android 未调用片段onCreateView,android,android-fragments,Android,Android Fragments,我有一个TabsPagerAdapter类,它扩展了FragmentPagerAdapter。我用它来填充3个选项卡。这三个视图都是片段 这就是它们的定义 public class DonorSearchFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, B

我有一个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());
    }
    ...
}
令人惊讶的是,第三个选项卡(即CampDonorResultsFragment)onCreateView()。因此,如果我对该片段调用任何方法,那么所有变量(在onCreateView()中实例化)都是null,并且我得到null指针异常


这里到底发生了什么,为什么在手动调用片段上的任何方法之前不调用onCreateView()。另外,为什么不在上面的第二个选项卡(DonorResultsFragment)上执行此操作。

查看页面仅保留当前页面,以及默认为1的指定的许多上一页/下一页

考虑重新设计您的代码,这样它就不会假设您的片段在任何时候都是活动的。不要在片段上调用方法,而是让片段在任何可用的地方提取它们需要的数据


作为一个快速解决方案,您可以将页面限制设置为更高的数字,如2,但这无法解决最终会在其他地方困扰您的潜在设计问题。

post
TabsPagerAdapter
完全!!您是对的,setOffscreenPageLimit()确实有效。然而,正如您所建议的,应该避免调用MainActivity中片段上的方法。在我的场景中,我仍在试图找出相同的答案。通常情况下,片段生成一些数据并传递给MainActivity,然后MainActivity再传递给其他片段的方式是什么。为此,您可以使用各种类型的事件总线(例如Otto)来分离数据生产者和消费者。
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));
        }
        ..
    }
}