“IllegalStateException异常:活动遭到破坏”何时“getSupportFragm

2019-07-19 17:18发布

我有一个具有包含一个孩子ViewPager一个ViewPager父片段活动。 孩子ViewPager包含每个页面片段。 我用一个回调接口,例如这些子页面片段和顶部父片段活动之间的沟通

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的页面片段致电setRetainInstance(真),因为它是不支持)。 但是如果我在孩子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)

有谁知道为什么出现这种情况?

谢谢

Answer 1:

当你旋转设备,Android的节省,销毁,并重新创建你的Activity及其ViewPagerFragments 。 由于ViewPager使用FragmentManager你的Activity ,它保存并重新使用这些Fragments给你(并不创造新的),所以他们将持有旧引用您的(现已被毁)原创Activity ,你拿到IllegalStateException

在你的孩子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的生命周期,你的Fragments将更新其旋转回调引用。



Answer 2:

我有一个类似的问题,我认为这是因为片段被保留,并保持到destoryed活动的参考,我的解决办法是保持在活动中如片段myfragment = NULL片段的引用。 然后使用MyFragment下面的代码:

    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((TestActivity)activity).contentFragment = this;
}


Answer 3:

也有类似的问题。 基本上,如果ViewPager只是有几个片段,然后将其存储在当前的活动对它们的引用。 不要叫pagerAdapter的getItem()时,因为它创建了一个新的片段,它是不依附于任何活动,这就是为什么我们看到“活动已被破坏”的例外。 如果你不希望保留片段的引用,那么你可以使用findViewWithTag()方法来获得片段对象。



Answer 4:

在OnPostResume回调提交事务固定我的问题。 由于以下博文http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

@Override
protected void onPostResume() {
    super.onPostResume();
    // Commit your transactions here.
}


Answer 5:

我有这个问题与嵌套的片段,并没有为我工作的计算器的解决方案。 只是现在看来,存在与支持库,当解雇片段仍然保存指针之前的活动(所以getFragmentManager()刚刚返回null,因为它被称为上已经破坏活动)中的错误,这就是为什么你需要自己管理的指针。 我结束了一个解决方案如下:
1.在第一级片段我被保存指针的活性的方法中

public void onAttach(Activity activity) {
        super.onAttach(activity);
        parentActivity = activity; // parentActivity is static variable
}

2.在该处理片段我结束了这段代码的活动:

private void launchFragment(Fragment fragment, Activity parent) {
            FragmentTransaction transaction;
            if(parent == null)
                transaction = mFragmentManager.beginTransaction();
            else    // for nested child fragments, workaround for Android parent pointer bug
                transaction = parent.getFragmentManager().beginTransaction();
            transaction.replace(R.id.container, fragment);
            transaction.addToBackStack(null);
            transaction.commit();
}

你应该通过只有当你调用第二级(嵌套)片段一级片段parentActivity,因为它似乎这个错误是只与嵌套那些你从前景带来应用程式后。



文章来源: 'IllegalStateException: Activity has been destroyed' when 'getSupportFragmentManager()' called after Activity restart