当平板电脑被纵向拍摄时,我在活动中有3个片段。但是在景观中我只有2个这样的片段。我遇到的问题是当从纵向到横向时,活动正在创建第3个片段。我收到并收到错误,因为无法创建此片段。
我已经知道这个片段正在创建,因为它位于后栈中。
我尝试使用
删除onDestroy方法中的片段FragmentTransaction f = fragmentManager.beginTransaction();
f.remove(mf);
f.commit();
但是我得到一个错误,说我在onSaveInstanceState后不能使用这个函数
将这个片段从后栈中取出来的正确方法是什么?
我应该补充一点,我遇到问题的片段是来自这个库的mapFragment
https://github.com/petedoyle/android-support-v4-googlemaps
我使用它的方式就是这样
mf = MapFragment.newInstance(1, true);
ft = fragmentManager.beginTransaction();
ft.replace(R.id.mapContainer, mf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack("map");
ft.commit();
答案 0 :(得分:151)
您从FragmentTransaction
添加到后台状态,并使用FragmentManager
pop方法从backstack中删除:
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();
答案 1 :(得分:14)
我创建了一个代码来跳转到所需的后台堆栈索引,它完全符合我的目的。
即。我有Fragment1,Fragment2和Fragment3,我想从Fragment3跳到Fragment1
我在Fragment3中创建了一个名为onBackPressed的方法,跳转到Fragment1
<强> Fragment3:强>
public void onBackPressed() {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-2).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
在活动中,我需要知道我当前的片段是否是Fragment3,所以我调用my片段的onBackPressed而不是调用super
<强> FragmentActivity:强>
@Override
public void onBackPressed() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.my_fragment_container);
if (f instanceof Fragment3)
{
((Fragment3)f).onBackPressed();
} else {
super.onBackPressed();
}
}
答案 2 :(得分:1)
您将片段显示在容器中(id = fragmentcontainer),因此您可以使用以下方式删除片段:
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
fragmentTransaction.remove(fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
答案 3 :(得分:-8)