我正在开发一个应用程序,它有一个Activity
和两个Fragments
,其中第二个Fragments
是第一个的孩子。当我进入第二个Fragments
并将语言从法语更改为英语时,系统会抛出IllegalStateException
当我返回应用程序时,它说Fragments
已经存在。
Caused by: java.lang.IllegalStateException: Fragment already added
SettingsFragment{d25576a #3 id=0x1020011}
android.support.v4.app.FragmentManagerImpl.addFragment
FragmentManager.java, line 1679
android.support.v4.app.BackStackRecord.executePopOps
BackStackRecord.java, line 781
android.support.v4.app.FragmentManagerImpl.executeOps
FragmentManager.java, line 2360
android.support.v4.app.FragmentManagerImpl.executeOpsTogether
FragmentManager.java, line 2149
android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps
FragmentManager.java, line 2103
android.support.v4.app.FragmentManagerImpl.execPendingActions
FragmentManager.java, line 2013
android.support.v4.app.FragmentController.execPendingActions
FragmentController.java, line 388
android.support.v4.app.FragmentActivity.onStart
FragmentActivity.java, line 607
android.support.v7.app.AppCompatActivity.onStart
AppCompatActivity.java, line 178
android.app.Instrumentation.callActivityOnStart
Instrumentation.java, line 1256
android.app.Activity.performStart
Activity.java, line 6972
android.app.ActivityThread.performLaunchActivity
您应该阅读堆栈跟踪的第一行:
非法状态异常:已添加片段
如果添加片段两次,请检查您的代码。
当您在
onCreate()
活动中添加片段时,请尝试检查if (savedInstanceState == null)
:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.main_frame_layout, new SettingsFragment())
.commit();
}
}
在添加片段之前,您应该检查此片段是否尚未添加
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (fragment == null) {
MyFragment myFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.container, myFragment).commit();
}