【发布时间】:2016-08-10 22:52:42
【问题描述】:
我有一个片段列表,可以在我的导航栏中打开:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment).commit();
片段都来自同一类型 -> CDMBasicMovieFragment extends Fragment
在这个片段中,我有一个viewpager,我用getFragmentManager() 调用它。在这里我有问题。第一个片段很好,但在替换第一个片段后,viewpager 是空的。然后我将getFragmentManager() 更改为getChildFragmentManager()。现在所有片段都很好。但只有1次。替换回第一个片段后,我遇到了同样的问题。我做错了什么?
编辑1:
我的视图层次结构:
-
活动
- CDMBasicMovieFragment 1
- 查看页面
- CDMMovieListFragment
- 查看页面
- CDMBasicMovieFragment 2
- 查看页面
- CDMMovieListFragment
- 查看页面
- CDMBasicMovieFragment 3
- 查看页面
- CDMMovieListFragment
- 查看页面
- CDMBasicMovieFragment 1
编辑2:
我尝试为片段创建唯一 id 并在替换时使用它们,但我已经遇到了同样的问题:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment, uniqueFragmentTag).commit();
编辑3:
我找到了一个可能的解决方案: OnCreateView called multiple times / Working with ActionBar and Fragments 我尝试了此链接中的所有内容。我已经遇到了同样的问题...有人可以帮忙吗?
更新:
经过密集的调试会话;)我发现了这个:
当加载第一个CDMMovieListFragment FragmentPagerAdapter 的instantiateItem 被调用并检查是否已经有一个片段。这不是它内部调用的原因
mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));
当我替换包含 fragmentpageradapter 的CDMBasicMovieFragment(内部是添加的CDMMovieListFragment)并尝试加载第二个CDMBasicMovieFragment 时,它仍然是同一个片段管理器。
FragmentPagerAdapter 的instantiateItem 被调用并找到了旧的CDMMovieListFragment。现在它改为调用mCurTransaction.attach(fragment);。我认为这就是问题所在。但是我很困惑...
【问题讨论】:
-
这与您的情况有关吗? mViewPager = (ViewPager) findViewById(R.id.pager); // 必须设置 OffscreenPageLimit,因为默认值为 1,我们有 3 个选项卡。如果加载程序完成时屏幕外不可用,则会崩溃,否则 mViewPager.setOffscreenPageLimit(2);
-
我不想更改 viewpager 中的片段。我想替换包含 viewpager 的片段。检查我的编辑。我添加了视图层次结构。
-
我明白了。这有点复杂。