【问题标题】:Poping the backstack without causing illegalStateException弹出回栈而不导致非法状态异常
【发布时间】:2017-02-13 11:03:40
【问题描述】:

我得到了
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在我的代码中,我搜索了 statckoverflow,我得到了以下代码作为解决方案。

现在我没有收到 IllegalStateException,但问题是.. 下面的代码正在清除整个堆栈跟踪。但我只想弹出后台堆栈中的最后一个事务/条目。该怎么做??

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

如何只弹出 backstack 中的最后一个事务/条目?

我如何添加到堆栈的代码:

      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();

【问题讨论】:

  • 张贴你的片段添加代码请。

标签: android android-fragments fragmentmanager fragment-backstack


【解决方案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);

【讨论】:

  • 感谢重播...最后一行 getSupportFragmentManager().popBackStackImmediate(getSupportFragmentManager().getBackStackEntryAt(last), FragmentManager.POP_BACK_STACK_INCLUSIVE);是 int 变量而不是字符串“last”...所以你能告诉如何用标签“last”弹出回栈
【解决方案2】:

对于这个错误:

java.lang.IllegalStateException: 之后无法执行此操作 onSaveInstanceState

使用commitAllowingStateLoss() 而不是commit(),问题就会消失。然后使用您想要的方法。

【讨论】:

  • 我将使用 commitAllowingStateLoss() 并使用 getSupportFragmentManager().popBackStackImmediate() 弹出最后一个条目;那么我这样做之后不会得到 IllegalStateException 吗??
  • 不,你不会。让我知道结果。
  • 这并没有解决弹出回栈时状态丢失的问题。在执行此操作(弹出回栈)之前,在 FragmentManager 中调用 checkStateLoss() 方法。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多