提问者:小点点

保存状态失败-目标不在片段管理器中(setTargetFragment)


我有一只猴子崩溃了,由此

java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA
at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1561)
at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:475)
at com.acme.ParentActivity.onSaveInstanceState(Unknown Source)

基本上FragmentA加载FragmentB并调用setTargetFrament来设置FragmentB的目标片段。

FragmentB然后简单地在其onCreate方法中调用getTargetFrament并在需要时挂起目标。

现在,我没有在目标片段的任何<code>onSaveInstanceState</code>调用中执行任何操作,比如将其设置为null、进行任何<code<saveFragmentInstanceState</code>、<code>putFragment</code〕等调用。问题是我应该用它做点什么吗?

提前感谢,

彼得。

**编辑1**我正在使用旧版本的支持库,并且有一种感觉,这可能会在最新版本中得到修复,如果是这样的话,将进一步测试并提供进一步的更新。但是,仍然有兴趣知道我是否应该对我目前没有做的目标片段做任何事情。

**编辑1 **用支持库8版修复(没试过其他)。


共3个答案

匿名用户

实际上,您应该做两件事来解决此问题:

1. 确保从 FragmentA 启动 FragmentB 时使用 getChildFragmentManager() 而不是 getFragmentManager()

调用getChildFragmentManager()将返回托管Fragment的FragmentManager,而getFragmentManager()将返回托管Activity的FragmentManager。使用 getChildFragmentManager() 很重要,因为您将一个片段嵌套在另一个片段中,因此父片段应该负责处理嵌套片段的任何事务。如果你使用 getFragmentManager(),你会遇到你现在遇到的问题。

2.不要使用setTargetFrament()和getTargetFrament(),使用getChildFragmentManager()时它们将不起作用

相反,请使用getParentFragment()。我相信现在Android中存在某种错误,即使您正确调用

fragmentB.setTargetFragment(fragmentA,0)

然后显示FragmentB,配置更改后,从FragmentB调用getTargetFrament()将返回自身而不是FragmentA。

匿名用户

解决方法如下:

将其放在导致问题的片段中:

@Override
public void onSaveInstanceState(final Bundle outState) {
    setTargetFragment(null, -1);
            ...

并记得在需要时将其设置为真正的目标片段。

匿名用户

当显示来自另一个片段的 DialogFrament 并在 DialogFragment 上使用 setTargetFragment 时,我遇到了这个问题。在显示 DialogFragment 时使用 getChildFragmentManager() 解决了该问题。

  1. 活动A添加了片段A
  2. FragmentA使用ActivityA的FragmentManager添加了DialogFragmentB
  3. 调用dialogFragmentB.setTargetFragment(fragmentA)
  4. 删除FragmentA并添加FragmentA的新实例
  5. 与ActivityA关联的FragmentManager仍然包含DialogFragmentB,它将FragmentA的第一个实例作为目标片段

这导致调用“失败保存状态 - 目标不在片段管理器中”异常。