0

フラグメントの削除/追加/置換を操作しようとしています。同じフラグメント クラス (同じインスタンスではない) を削除して再度追加しようとすると、問題が発生します。

アクティビティ全体をクリアします。

        for (int i = 0; i < frags.length; i++) {
            BaseFragment fragment = frags[i];
            if (!exsitingFragments.contains(fragment))
                continue;
            FragmentTransaction ft1 = getSupportFragmentManager().beginTransaction();
            ft1.detach(fragment);
            ft1.remove(fragment);
            ft1.commit();
            getSupportFragmentManager().executePendingTransactions();
        }

フラグメントの新しいインスタンスを追加します。

        for (Object object : fragmentTypes) {
            FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();
            Class<? extends BaseFragment> fragmentType = (Class<? extends BaseFragment>) object;

            Fragment finalFragment = Tools.createNewInstance(fragmentType);
            ft2.add(parentViewId, finalFragment);
            ft2.commit();
            getSupportFragmentManager().executePendingTransactions();
        }

これは初めてうまく機能し、アプリケーションの他のすべての画面でもうまく機能しますが、画面を再作成しようとすると、たとえば、このロジックを再度呼び出し、すべてのフラグメントを削除し、これらのフラグメントの新しいインスタンスを追加します。次のエラーが発生します。

08-14 15:20:50.086: E/AndroidRuntime(11443): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3739)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.ViewGroup.addView(ViewGroup.java:3610)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.ViewGroup.addView(ViewGroup.java:3586)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:770)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at com.mypermissions.core.ui.BaseFragment.onCreateView(BaseFragment.java:83)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
08-14 15:20:50.086: E/AndroidRuntime(11443):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)

フラグメントに ViewPager ビューがある場合にのみ発生するため、これは奇妙です。これまでのところ、このロジックは正常に機能します。NoSaveStateFrameLayoutには既に親があり、他のビューがないため、このエラーがスローされるのは奇妙なことです。 ...

私はこれを試しました:

    ViewGroup rootView = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
    rootView.removeAllViews();

しかし、短いデバッグの後、 NoSaveStateFrameLayoutのインスタンスが複数あり、削除できたインスタンスを削除しても、例外の原因となったインスタンスとは異なることがわかりました。

それを解決する方法はありますか?

4

1 に答える 1

0

どうやら私は同じフラグメントを 2 回追加していたようです。 .

于 2014-12-24T13:48:19.337 に答える