未调用片段onCreateView

时间:2014-09-30 05:19:22

标签: android android-fragments

我有一个 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)上发生这种情况。

1 个答案:

答案 0 :(得分:2)

查看寻呼机仅保留当前页面,以及off-screen page limit指定的多个上一页/下一页,默认为1。

考虑重新设计您的代码,以便它不会假设您的片段始终处于活动状态。不是在片段上调用方法,而是让片段在任何可用的地方提取所需的数据。

作为一个快速解决方案,您可以将页面限制设置为更高的数字,例如2,但这不会解决最终会让您陷入其他地方的基础设计问题。