web-dev-qa-db-ja.com

IllegalStateException:フラグメントはすでにtabhostフラグメントに追加されています

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にはtab2にフラグメントトランザクションを作成するボタンがあります(フラグメントアクティビティで関数を呼び出しています)

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

次のように実行すると例外があります。

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

それを修正する方法は?助けてくれてありがとう

59
user782104

これは、閉じる前に同じフラグメントまたはDialogFragmentを2回追加しようとすると発生します。

ただ電話する

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

そうは言っても、フラグメント内のメソッドにパラメーターを渡すだけでUI /データを更新できるため、古いフラグメントを削除して同じフラグメントを再度追加する理由はわかりません。

118
Ujju

以下に示すフラグメントの1つの条件を確認するだけです。

if(!isAdded())
{
    return;
}

isAdded =フラグメントが現在そのアクティビティに追加されている場合、trueを返します。公式ドキュメントから取得。既に追加されている場合、このフラグメントは追加されません

以下のリンクを参照してください:
http://developer.Android.com/reference/Android/app/Fragment.html#isAdded()

8
Deep Mehta

フラグメントトランザクションを開始する前に1つの条件を確認する必要があります。

 if (!fragmentOne.isAdded()){
            transaction = manager.beginTransaction();
            transaction.add(R.id.group,fragmentOne,"Fragment_One");
            transaction.commit();
 }

これは私のために実際に働いています...

7
Mehul Solanki

古いフラグメントがまだ追加されている場合は削除し、新しいフラグメントを追加します。

FragmentManager fm = getSupportFragmentManager();
Fragment oldFragment = fm.findFragmentByTag("fragment_tag");
if (oldFragment != null) {
    fm.beginTransaction().remove(oldFragment).commit();
}
MyFragment newFragment = new MyFragment();
fm.beginTransaction().add(newFragment , "fragment_tag");
7
vovahost

それぞれのレイアウトから適切なIDを見つけられないことが時々起こります。私はこの問題に直面しました。それから何時間も経って、間違ったrecyclerview idを設定したことがわかりました。私はそれを変えて、私のためにうまく働きます。

そのため、フラグメントレイアウトを再確認してください。

1
Mihab

FragmentStatePagerAdapterViewPagerに、すでに存在するアイテムを作成した場合にも発生する可能性があります。

override fun getItem(position: Int): Fragment {
    return tabs[0] // Right variant: tabs[position]
}

private val tabs: List<Fragment>はタブ内のフラグメントのリストです)。

0
CoolMind

以下のようにフラグメントを追加します

FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    t.replace(R.id.realtabcontent, mFrag);
    t.addToBackStack(null);
    t.commitNowAllowingStateLoss();
0
M.Noman

私にとっては次のように動作します:

Fragment oldFragment = manager.findFragmentByTag(READER_VIEW_POPUP);
if (oldFragment != null) {
    manager.beginTransaction().remove(oldFragment).commit();
}

FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
0
Farid Haq

驚いたことに、フラグメントトランザクションを2回呼び出すことで愚かな間違いを犯しました。

if (!FirebaseManager.isClientA && !FirebaseManager.isClientB) {
      fragment = new FragmentA();
      getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();
} else if (FirebaseManager.isClientB) {
      fragment = new FragmentB();
} else {
      fragment = new FragmentC();
}
getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();

同じ間違いをしないでください。

0
Seto Elkahfi