弹出回退栈而不引起 IllegalStateException 的方法

4

我在我的代码中遇到了以下问题:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

我在stackoverflow上搜索得到以下代码作为解决方案。

现在,我不再遇到IllegalStateException的问题了,但是下面的代码清除了整个堆栈跟踪。 但我只想弹出后退栈中的最后一个事务/条目。 该怎么做?

            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack(getSupportFragmentManager().getBackStackEntryAt(0).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }

如何只弹出回退栈中的最后一个事务/条目?
我添加到回退栈的代码如下:
      fragmentManager.beginTransaction().
                setCustomAnimations(R.anim.slide_in_left, R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_out_right).
                replace(R.id.content_frame, pageFragment, currentItem).
                addToBackStack(currentItem).
                commit();

1
请发布你的代码片段。 - A. Badakhshan
2个回答

1
对于这个错误:
java.lang.IllegalStateException: 在 onSaveInstanceState 之后无法执行此操作
使用 commitAllowingStateLoss() 替代 commit(),问题将会消失。然后使用你想要的方法。

1
我将使用 commitAllowingStateLoss() 并使用 getSupportFragmentManager().popBackStackImmediate() 弹出最后一个条目,这样做后我不会遇到 IllegalStateException 吗? - kumar
不,你不会。让我知道结果。 - A. Badakhshan
1
这并没有解决从后退栈中弹出时状态丢失的问题。在执行此操作(弹出后退栈)之前,FragmentManager会调用checkStateLoss()方法。 - Ryan Newsom

1
弹出最后一笔交易记录:
int last = getActivity().getSupportFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry entry = getSupportFragmentManager().getBackStackEntryAt(last);
String tag = entry.getName();
Fragment fragment = getSupportFragmentManager().findFragmentByTag("last");  //get the last fragment

在交易期间,您还需要添加标签。
fragmentTransaction.addToBackStack("last");

你也可以使用popBackStackImmediate来弹出最后一个片段:
getSupportFragmentManager().popBackStackImmediate(getSupportFragmentManager().getBackStackEntryAt(last), FragmentManager.POP_BACK_STACK_INCLUSIVE);

使用标签从BackStack中弹出片段,请使用以下代码:

 getSupportFragmentManager().popBackStack ("last", FragmentManager.POP_BACK_STACK_INCLUSIVE);

感谢回复...在这一行中最后的部分是使用整数变量而不是字符串"last"来实现调用getSupportFragmentManager().popBackStackImmediate(getSupportFragmentManager().getBackStackEntryAt(last), FragmentManager.POP_BACK_STACK_INCLUSIVE)。所以请问如何使用标签"last"来弹出返回栈? - kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接