我遇到了片段问题,或者更确切地说是我希望它们工作的方式。
在我的活动中,我有一个布局容器(R.id.container1),我在启动时以编程方式向其中添加了一个片段(FragMain)。在片段中,我有 2 个片段(Frag1、Frag2)和一个 ViewPager,它通过 FragmentPagerAdapter 加载其他几个片段(FragA、FragB、FragC、FragD、FragE)。
在按下按钮时,我替换了 R.id.container1 的全部内容,因此 FragMain 被另一个 Fragment (FragSub) 替换。现在当我按下后退按钮时,FragMain 再次加载,但 ViewPager 没有完全初始化,一些片段丢失了。根据我的观察,它总是缺少 FragB 和 FragD,如果我滚动到空视图,应用程序就会崩溃。其他片段似乎还不错。这里出了什么问题?
该线程建议在创建 PagerAdapter 时使用 getChildFragmentManager,但我已经这样做了... ViewPager 中的片段在 popBackStack 后未恢复
我通过例如访问片段
((FragA)((PagerAdapter)viewPager.getAdapter()).getItem(0));
这是最好的方法吗?
一些代码:
MainActivity 的 onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pagerFragList = new Vector<Fragment>();
pagerFragList.add(Fragment.instantiate(this, FragA.class.getName()));
pagerFragList.add(Fragment.instantiate(this, FragB.class.getName()));
pagerFragList.add(Fragment.instantiate(this, FragC.class.getName()));
pagerFragList.add(Fragment.instantiate(this, FragD.class.getName()));
pagerFragList.add(Fragment.instantiate(this, FragE.class.getName()));
FragMain fragMain = (FragMain)getSupportFragmentManager().findFragmentByTag(FragMain.debugTag);
if(fragMain==null) fragMain = new FragMain();
FragmentHelper.replaceSupportFragment(this, fragMain, R.id.container1, false, FragMain);
}
帮手
public Vector<Fragment> getFragList() {
return pagerFragList;
}
FragMain 的 onViewCreated
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
pagerAdapter = new PagerAdapter(getChildFragmentManager(), ((MainActivity)getActivity()).getFragList());
viewPager = ((ViewPager)view.findViewById(R.id.viewPager));
viewPager.setAdapter(pagerAdapter);
viewPager.setOffscreenPageLimit(5);
viewPager.setCurrentItem(0, true);
}
寻呼机适配器
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments=fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}