Android 未调用片段onCreateView
我有一个TabsPagerAdapter类,它扩展了FragmentPagerAdapter。我用它来填充3个选项卡。这三个视图都是片段 这就是它们的定义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
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));
}
..
}
}