gpt4 book ai didi

android - '非法状态异常 : Activity has been destroyed' when 'getSupportFragmentManager()' called after Activity restart

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:37 24 4
gpt4 key购买 nike

我有一个父 fragment Activity ,它有一个包含子 ViewPager 的 ViewPager。子 ViewPager 包含每个页面的 fragment 。我使用回调接口(interface)在这些子页面 fragment 和顶级父 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); 时,所有 fragment 都重新初始化(我不在子 ViewPager 的页面 fragment 中调用 setRetainInstance(true),因为它不受支持)。但是,如果我单击子 ViewPager 的 fragment 中的列表项,则会出现此异常:

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)

有人知道为什么会这样吗?

谢谢

最佳答案

当您旋转设备时,Android 会保存、销毁并重新创建您的 Activity 及其 ViewPagerFragments。由于 ViewPager 使用您的 ActivityFragmentManager,它会为您保存和重用这些 Fragments(并且不会创建新的),因此它们将保留对您的(现已销毁的)原始 Activity 的旧引用,并且您会得到 IllegalStateException

在你的 child Fragments 中,尝试这样的事情:

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.v(TAG, "onAttach");

// Check if parent activity implements our callback interface
if (activity != null) {
try {
mParentCallback = (Callbacks) activity;
}
catch (ClassCastException e) {
}
}
}

然后当发生选择时:

if(mParentCallback != null) {
mParentCallback.onItemSelected(selectedLink);
}

由于 onAttach 作为 Fragment 生命周期的一部分被调用,您的 Fragment 将在旋转时更新它们的回调引用。

关于android - '非法状态异常 : Activity has been destroyed' when 'getSupportFragmentManager()' called after Activity restart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14800192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com