我有一个片段列表,我可以在导航栏中打开:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment).commit();
片段全部来自相同类型 - > CDMBasicMovieFragment extends Fragment
在这个片段中,我有一个我用getFragmentManager()
打电话的viewpager。在这里我有问题。第一个片段很好,但在替换第一个片段后,viewpager为空。然后我将getFragmentManager()
更改为getChildFragmentManager()
。现在所有片段都很好。但只有一次。在替换回第一个片段后,我遇到了同样的问题。我做错了什么?
编辑1:
我的视图层次结构:
活动
EDIT2:
我尝试为片段创建唯一的ID并在替换时使用它们但我已经遇到了同样的问题:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment, uniqueFragmentTag).commit();
EDIT3:
我找到了一个可能的解决方案: 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);
。我想这就是问题所在。但我很困惑......
答案 0 :(得分:3)
我解决了我的问题。
现在我总是这样替换CDMBasicMovieFragment
:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, CDMBasicMovieFragment.newInstance()).commit();
在调用FragmentPagerAdapter的构造函数时,我将getFragmentManager
更改为getChildFragmentManager
。
我想我可以创建所有片段一次,如果我点击导航栏(画板)的项目就可以替换它们。但replace
将删除创建一次的片段,当我想再次替换删除的片段时,它不存在。这就是为什么我得到一个空的viewpager。
答案 1 :(得分:0)
尝试以下代码段,在自定义寻呼机适配器中:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
然后在包含ViewPager的Activity中
final MyPagerAdapter adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
... anything you may need to do to handle pager state ...
adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
}
}