从后面的堆栈中删除一个片段

我有一个3片段的活动时,平板电脑举行的肖像。然而,我只有2个这些碎片时,在景观。我遇到的问题是,当从肖像到景观的活动是创建第三个片段。由于无法创建这个片段,我收到了错误消息。

我已经算出,正在创建这个片段是因为它在后面的堆栈中。

我试图删除 onDestroy 方法中的片段

FragmentTransaction f = fragmentManager.beginTransaction();
f.remove(mf);
f.commit();

然而,我得到一个错误说,我不能使用这个函数后,onSaveInstanceState

从后面的堆栈中取出这个碎片的正确方法是什么?

更新

我可能应该补充说,我遇到问题的片段是来自这个库的映射片段

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();
146169 次浏览

您可以使用 FragmentManager pop 方法从 FragmentTransaction添加到后端状态并从后端堆栈中移除:

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

如果要删除的片段不在堆栈顶部,会发生什么情况?

然后你可以使用这些函数

popBackStack(int arg0, int arg1);

popBackStack(String arg0, int arg1);

我创建了一个代码来跳转到所需的回栈索引,它工作得很好,我的目的。

我有片段1,片段2和片段3,我想从片段3跳到片段1

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

片段3:

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

在活动中,我需要知道我当前的片段是否是 Fragment3,所以我调用片段的 onBackPress 而不是 super

片段活动:

@Override
public void onBackPressed() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.my_fragment_container);
if (f instanceof Fragment3)
{
((Fragment3)f).onBackPressed();
} else {
super.onBackPressed();
}
}

在一个容器中显示片段(使用 id = FragmentContainer) ,因此可以使用以下方法删除片段:

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

如果你在这里试图弄清楚如何从回栈中删除片段,并且正在使用 Android Jetpack 导航组件,那么你可以在导航图 xml 的操作节点中使用 app: popUpTo 和 app: popUpToInsive 来指定你想要从回栈中弹出的片段。 Https://developer.android.com/guide/navigation/navigation-navigate#pop 还有这个 Https://stackoverflow.com/a/51974492/4594986