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();
次のように実行すると例外があります。
それを修正する方法は?助けてくれてありがとう
これは、閉じる前に同じフラグメントまたはDialogFragmentを2回追加しようとすると発生します。
ただ電話する
if(mFragment.isAdded())
{
return; //or return false/true, based on where you are calling from
}
そうは言っても、フラグメント内のメソッドにパラメーターを渡すだけでUI /データを更新できるため、古いフラグメントを削除して同じフラグメントを再度追加する理由はわかりません。
以下に示すフラグメントの1つの条件を確認するだけです。
if(!isAdded())
{
return;
}
isAdded =フラグメントが現在そのアクティビティに追加されている場合、trueを返します。公式ドキュメントから取得。既に追加されている場合、このフラグメントは追加されません
以下のリンクを参照してください:
http://developer.Android.com/reference/Android/app/Fragment.html#isAdded()
フラグメントトランザクションを開始する前に1つの条件を確認する必要があります。
if (!fragmentOne.isAdded()){
transaction = manager.beginTransaction();
transaction.add(R.id.group,fragmentOne,"Fragment_One");
transaction.commit();
}
これは私のために実際に働いています...
古いフラグメントがまだ追加されている場合は削除し、新しいフラグメントを追加します。
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");
それぞれのレイアウトから適切なIDを見つけられないことが時々起こります。私はこの問題に直面しました。それから何時間も経って、間違ったrecyclerview idを設定したことがわかりました。私はそれを変えて、私のためにうまく働きます。
そのため、フラグメントレイアウトを再確認してください。
FragmentStatePagerAdapter
のViewPager
に、すでに存在するアイテムを作成した場合にも発生する可能性があります。
override fun getItem(position: Int): Fragment {
return tabs[0] // Right variant: tabs[position]
}
(private val tabs: List<Fragment>
はタブ内のフラグメントのリストです)。
以下のようにフラグメントを追加します
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commitNowAllowingStateLoss();
私にとっては次のように動作します:
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();
驚いたことに、フラグメントトランザクションを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();
同じ間違いをしないでください。