【问题标题】:ViewPager Fragments missing after popBackStackpopBackStack 后 ViewPager 片段丢失
【发布时间】:2013-08-14 10:55:22
【问题描述】:

我遇到了片段问题,或者可能是我希望它们工作的方式。

在我的活动中,我有一个布局容器 (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();
}

}

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    不知道为什么这似乎是在我这边解决它,但请尝试注释掉您的“viewPager.setOffscreenPageLimit(5);”行。

    我仍在调查中,如果我发现其他有用的信息,我会回来提供更多信息。


    事实证明,我必须做的另一件事是像这样覆盖 FragmentStatePagerAdapter 的“状态”方法:

    @Override
    public Parcelable saveState() {
        return null;
    }
    
    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
        //do nothing
    }
    

    为了绕过导致问题的任何奇怪的事情(必须与保存和恢复 ViewPager 中嵌套片段的状态有关......

    【讨论】:

      【解决方案2】:

      有很多涉及片段状态和回栈转换的排列。对于调试,它可能有助于隔离您正在使用的事件(后退按钮、方向更改...)并在您的事件之前和之后查看以下内容....

      我认为包含 backstack 的片段管理器的状态...

      //debug
              getFragmentManager().dump("", null, 
                       new PrintWriter(System.out, true), null);
      

      看到这个thread

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多