当您的方向改变时您可以删除片段 B,为什么要为您的查看器使用两个不同的 id?
您可以像这样在 onCreateView() 或 onResume() 中检索片段(此示例在父片段中工作,但也可在父活动中使用,例如 onResume() ):
@Override
public void onResume() {
super.onResume();
// ... initialize components, etc.
pager.setAdapter(pagerAdapter);
List<Fragment> children = getChildFragmentManager().getFragments();
if (children != null) {
pagerAdapter.restoreFragments(children, orientation);
}
}
然后在你的适配器里面:
@Override
public void restoreFragments(List<Fragment> fragments, int orientation) {
List<Fragment> fragmentsToAdd = new ArrayList<Fragment>();
Collections.fill(fragmentsToAdd, null);
if (Configuration.ORIENTATION_LANDSCAPE == orientation) {
for (Fragment f : fragments) {
if (!(f instanceof FragmentB)) {
fragmentsToAdd.add(f);
}
}
}
this.fragmentsInAdapter = Arrays.copyOf(temp.toArray(new Fragment[0]), this.fragments.length); // array of all your fragments in your adapter (always refresh them, when config changes, else you have old references in your array!
notifyDataSetChanged(); // notify, to remove FragmentB
}
那应该行得通。
顺便提一句。如果您使用的是 Support Library V13,则不能使用 FragmentManager.getFragments(),因此您需要通过 id 或 tag 获取它们。