从后堆栈中取出碎片


70

将平板电脑纵向放置时,活动中有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();

1
您只需要删除此行的ft.addToBackStack(“ map”)`。
M.Usman'3

Answers:


173

您可以FragmentTransaction使用FragmentManagerpop方法从中添加到back状态,并从backstack中删除它:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();

61
如果要删除的片段不在堆栈顶部,该怎么办?
Kuno

2
是的,当片段不在堆栈顶部时,我不工作了。
AJit

您找到该问题的解决方案了吗?
机器人

2
如果您事先知道该片段不应该是backstack的一部分,则可以将“ addToBackstrack(null)”留在外面。
marktani

4
我想知道为什么删除后必须调用manager.popBackStack()。我本来希望可以除去除去交易,但还是要感谢
j2emanue

17

我创建了一个代码以跳转到所需的反向堆栈索引,它可以很好地达到我的目的。

即。我有Fragment1,Fragment2和Fragment3,我想从Fragment3跳到Fragment1

我在Fragment3中创建了一个名为onBackPressed的方法,该方法跳转到Fragment1

片段3:

public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-2).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

在活动中,我需要知道当前片段是否为Fragment3,所以我调用片段的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();
    }
}

3
但是,如果有大量片段,代码会变得混乱,对吗?(我有20个片段)
Kathir

1

您将片段显示在容器中(标识为id = fragmentcontainer),因此可以使用以下方式删除片段:

 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
            fragmentTransaction.remove(fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

-13

如果要删除的片段不在堆栈顶部,该怎么办?

然后您可以使用这些功能

popBackStack(int arg0, int arg1);

popBackStack(String arg0, int arg1);


24
我认为这是错误的,如果您阅读文档“ ...up to that state将弹出所有状态”,因此它不会完全删除该片段,它将删除堆栈中位于其之上的所有内容(以及片段本身取决于标志) )。
Ixx 2014年

我不明白为什么人们不赞成Dornathal的回答,而反对@lxx的评论!这就是定义堆栈的方式
iSWORD

2
@iSWORD因为该问题还暗示着您如何只删除一个不在顶部的片段
teh.fonsi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.