1. ホーム
  2. android

[解決済み] IllegalStateException: タブホストフラグメントで既に追加されたフラグメント

2023-02-13 14:36:58

質問

FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
    at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5068)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    at dalvik.system.NativeStart.main(Native Method)

ということで、tabhostでビルドしたandroidアプリがあります。全部で3つのタブがあり、その中のtab2にフラグメントトランザクションを行うボタンがあります(フラグメントアクティビティ内の関数を呼び出すことになります)。

FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        t.replace(R.id.realtabcontent, mFrag);
        t.addToBackStack(null);
        t.commit();

このように実行すると、例外が発生します。

  1. タブ2の中で、フラグメントを変更するボタンを押します。
  2. 他のタブに移動する(例:タブ1、タブ3)
  3. 戻るボタンを押す
  4. 例外を投げる

どのようにそれを修正するのですか?助けてくれてありがとうございます。

どのように解決するのですか?

同じフラグメントやDialogFragmentを2回追加してから終了させようとすると、この現象が発生します。

を呼び出すだけです。

if(mFragment.isAdded())
{
     return; //or return false/true, based on where you are calling from
}

とはいえ、フラグメント内のメソッドにパラメータを渡すだけでUIやデータを更新できるので、古いフラグメントを削除して同じフラグメントを再度追加する理由はないでしょう。