当前位置: 首页 > 知识库问答 >
问题:

popBackStack后缺少ViewPager片段

养翔
2023-03-14

我对片段有问题,或者更确切地说是我希望它们工作的方式有问题。

在我的活动中,我有一个布局容器(R.id.container1),我在启动时以编程方式向其中添加一个片段(FragMain)。在片段中,我有2个片段(Frag1、Frag2)和一个ViewPager,它通过FragmentPagerAdapter加载其他几个片段(FragA、FragB、FragC、FragD、FragE)。

按下一个按钮,我替换R.id.container1的全部内容,因此FragMain被另一个片段(FragSub)替换。现在,当我按下后退按钮时,FragMain再次加载,但ViewPager没有完全初始化,一些片段缺失。从我观察到的情况来看,总是缺少FragB和FragD,如果我滚动到空视图,应用程序就会崩溃。其他碎片似乎很好。这里怎么了?

这个帖子建议在创建PagerAdapter时使用getChildFragmentManager,但我已经在这么做了。。。popBackStack后未还原ViewPager中的片段

我正在通过访问碎片,例如。

((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();
}

}

共有2个答案

魏健柏
2023-03-14

有许多置换涉及片段状态和回叠转换。对于调试,它可能有助于隔离正在处理的事件(backbutton、方向更改…)并在活动前后查看以下内容。。。。

碎片管理器的状态,其中包括我相信的Backback。。。

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

看到这个线程了吗

申屠瀚海
2023-03-14

我不知道为什么这似乎是在我这边解决它,但是试着评论一下你的“viewPager.setOffScrePageLimit(5);”行。

我仍在调查,如果我发现其他有用的东西,我会带着更多回来。

事实证明,我必须做的另一件事是覆盖FragmentStatePagerAdapter的“状态”方法,如下所示:

@Override
public Parcelable saveState() {
    return null;
}

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

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

 类似资料:
  • 只要不按后退键,一切都很好。一旦用户关闭其中一个子页面列表,就会重新创建以前的列表,但没有以前显示的页面。在父页面列表中浏览其他页面仍然有效。 在GitHub上可以找到一个示例应用程序:

  • 我在我的支持FragmentTransaction上使用了setCustomAnimations,但当我执行addToBackStack时,它所做的只是动画,而当我执行popBackStack时,它只是在没有动画的情况下消失。 下面是我的一段代码: 在setCustomAnimations部分,我使用了4个参数,到目前为止,它只在我调用FragmentAccount时显示幻灯片前的淡出动画,而在调

  • 我找到的唯一解决办法就是打电话给 在显示父片段之后。这会以某种方式触发视图被重新创建并出现在屏幕上。不幸的是,这有时会导致在旧的观察器上处理两次调用的寻呼机适配器时出现异常。 有没有更好的办法做到这一点?我想我要问的是:

  • 下面是: 这是我要用于向中添加项的方法

  • 我想在一个Android应用程序中使用3个片段,ired:creating-and-using-fragmentpageradapter。但是我想使用viewpager来滑动和显示片段,就像在:ViewPager-with-FragmentPagerAdapter中解释的那样。但是这个代码或者Android Studio示例的默认代码,每次需要时使用newInstance创建实例,不需要时销毁。