从后堆栈中删除片段

jid*_*vah 59 android android-fragments

当平板电脑被纵向握持时,我在活动中有3个片段.但是在景观中我只有2个这样的片段.我遇到的问题是当从纵向到横向时,活动正在创建第3个片段.我收到并收到错误,因为无法创建此片段.

我已经知道这个片段正在创建,因为它位于后栈中.

我试图通过使用删除onDestroy方法中的片段

FragmentTransaction f = fragmentManager.beginTransaction();
f.remove(mf);
f.commit();
Run Code Online (Sandbox Code Playgroud)

但是我得到一个错误,说我不能在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();
Run Code Online (Sandbox Code Playgroud)

use*_*321 159

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

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();
Run Code Online (Sandbox Code Playgroud)

  • 如果要删除的片段不在堆栈顶部会发生什么? (48认同)
  • 是的,当片段不在堆栈顶部时,我不工作了。 (2认同)
  • 如果您事先知道该片段不应该是Backstack的一部分,那么您可以将"addToBackstrack(null)"保留为out. (2认同)
  • 我想知道为什么我必须在删除后调用manager.popBackStack().我会有,但只有删除交易将摆脱它,谢谢 (2认同)

小智 15

我创建了一个代码来跳转到所需的后台堆栈索引,它完全符合我的目的.

即.我有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);
}
Run Code Online (Sandbox Code Playgroud)

在活动中,我需要知道我当前的片段是否是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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