我有一个父级片段活动,它具有包含子ViewPager的ViewPager。子ViewPager包含每个页面的片段。我使用回调接口在这些子页面片段和顶层父页面片段活动之间进行通信。'IllegalStateException:活动已被销毁'当'getSupportFragmentManager()'在活动重新启动后调用
public interface Callbacks {
public void onItemSelected(Link link);
}
在父母片段活动中,我监听onItemSelected
事件,例如,
@Override
public void onItemSelected(Link link) {
Bundle argumentsFront = new Bundle();
argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link);
fragmentComments = new FragmentComments();
fragmentComments.setArguments(argumentsFront);
getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss();
}
现在这个工作正常,当应用程序第一次启动。
如果您打开设备更改方向,则重新启动“活动”。当我使用setRetainInstance(true);
(我没有在子ViewPager的页面Fragments中调用setRetainInstance(true),因为它不受支持),所有片段重新初始化自己。但是如果我在孩子的片段点击列表项ViewPager我得到这个异常:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
有谁知道为什么会这样?
感谢
不幸的是,这不起作用。我的'onAttach'方法看起来就像你提供的方法。在方向改变我的'onAttach'方法不会再次被调用,因此我的回调没有被更新。 父Fragment有'setRetainInstance(true)',我想这可以防止这个子Fragment被分离? – Milo 2013-02-12 22:45:51
即使设置了“setRetainInstance(true)”,根据文档'onAttach'仍然应该被调用,所以在这里可能会出现其他问题。你可以发布更多关于设置和调用回调的代码吗?此外,检查出这个问题的答案,使用'setRetainInstance(true)'在这种情况下不是一个好习惯,你应该保存并恢复状态 - http://stackoverflow.com/questions/11182180/understanding-fragments- setretaininstanceboolean – 2013-02-12 22:57:10
我找到了一个解决方案。由于已经嵌套片段是这样的: (FragmentActivity - >片段1 - >片段2(带ViewPager) - > ViewPager儿童片段) 我不得不回调移动到片段1(其中onAttach和onDetach正在调用) 。然后,我从ViewPager的子碎片中的'onItemSelected'方法向父Fragment(碎片1)中的回调进行静态调用。 这似乎有点黑客,但效果很好。我在片段1中使用'setRetainInstance(true)',这样子片段也保持状态。 – Milo 2013-02-13 09:21:48