我有一只猴子崩溃了,由此
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版修复(没试过其他)。
实际上,您应该做两件事来解决此问题:
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() 解决了该问题。
这导致调用“失败保存状态 - 目标不在片段管理器中”异常。