我有一个父Fragment Activity,其中包含一个子ViewPager。 子ViewPager 包含每个页面的Fragments。 我使用回调接口在这些子页面片段和顶部父Fragment Activity之间进行通信,例如。
public interface Callbacks {
public void onItemSelected(Link link);
}
在父Fragment Activity中,我监听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();
}
当应用程序首次启动时,这很好用。
如果您旋转设备以更改方向,则Activity会重新启动。所有片段都将重新初始化,因为我使用了setRetainInstance(true);
(在子ViewPager的页面片段中不调用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 被分离? - MiloonItemSelected
方法中向父片段(片段1)的回调函数进行静态调用。这似乎有点像黑客,但很有效。我在片段1中使用setRetainInstance(true)
,这样子片段也会保留状态。 - MilogetParentFragment()
转换为获取实现回调的父“Fragment”的引用。也许这可以帮助找到更清晰的解决方案,但无论如何,很高兴你找到了一个解决方法。 - Steven Byle