我遇到片段问题,或者更确切地说是我希望它们工作的方式。
在我的活动中,我有一个布局容器(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,但我已经这样做了...... Fragment in ViewPager not restored after 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);
}
PagerAdapter
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();
}
}
答案 0 :(得分:1)
不知道为什么这似乎是在我的最后修复它,但尝试注释掉你的“viewPager.setOffscreenPageLimit(5);”线。
我还在调查,如果我发现其他任何有用的东西,我会回来的。
事实证明,我必须做的另一件事是覆盖FragmentStatePagerAdapter的“state”方法,如下所示:
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
//do nothing
}
为了绕过导致问题的任何奇怪的事情(必须与在ViewPager中保存和恢复嵌套片段的状态有关...
答案 1 :(得分:0)
有很多涉及碎片状态和背堆转换的排列。对于调试,可能有助于隔离您正在使用的事件(后退按钮,方向更改...)并在事件发生之前和之后查看以下内容....
片段管理器的状态,包括我相信的后台...
//debug
getFragmentManager().dump("", null,
new PrintWriter(System.out, true), null);
请参阅此thread