片段删除会导致崩溃



当用户按下设置按钮时,我显示设置片段。我想在用户从设置中单击后退按钮时将其删除。

当用户单击设置按钮时,我正在运行以下代码:

FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
SettingsFragment conv=new SettingsFragment();
SettingsFragment.newInstance(LOGGED_USERNAME,LOGIN_KEY);
fragmentTransaction.add(R.id.container,conv,"SettingsFragment");
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

当用户从设置片段中按下后退按钮时,我正在运行这个:

Fragment fragment = Ffmanager.findFragmentByTag("SettingsFragment");
if(fragment != null) {
     FfTransaction.remove(fragment).commit();
}

场景:

1)主屏幕上的用户

2)单击设置按钮

3)从设置中单击后退按钮(现在一切都很好)

4)再次单击设置按钮

5)然后再次单击返回按钮

然后应用程序崩溃。但是为什么?

日志猫:

01-09 13:47:39.572: E/AndroidRuntime(2628): FATAL EXCEPTION: main
01-09 13:47:39.572: E/AndroidRuntime(2628): java.lang.IllegalStateException: commit already called
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:582)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.impact.app.MainActivity.fragmentCleaner(MainActivity.java:422)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.impact.app.MainActivity.returnFromChat(MainActivity.java:1279)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.impact.app.MainActivity.overrideHome(MainActivity.java:1154)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.impact.app.MainActivity.onOptionsItemSelected(MainActivity.java:1097)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.app.Activity.onMenuItemSelected(Activity.java:2566)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:373)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.android.internal.widget.ActionBarView$3.onClick(ActionBarView.java:171)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.view.View.performClick(View.java:4240)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.view.View$PerformClick.run(View.java:17721)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.os.Handler.handleCallback(Handler.java:730)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.os.Looper.loop(Looper.java:137)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at android.app.ActivityThread.main(ActivityThread.java:5103)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at java.lang.reflect.Method.invokeNative(Native Method)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at java.lang.reflect.Method.invoke(Method.java:525)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-09 13:47:39.572: E/AndroidRuntime(2628):     at dalvik.system.NativeStart.main(Native Method)

基本上你犯了两次相同的FragmentTransaction

考虑异常消息:

  java.lang.IllegalStateException: commit already called

还要考虑:

公共抽象 int 提交 ()

在 API 级别 11 中添加 计划此事务的提交。这 提交不会立即发生;它将被安排为工作 下次线程准备就绪时要完成的主线程。

事务只能在其之前使用此方法提交 包含保存其状态的活动。如果在之后尝试提交 这一点,将引发异常。这是因为状态 在提交后,如果需要从中还原活动,则可能会丢失 它的状态。请参阅 commitAllowingStateLoss() 了解可能出现的情况 可以丢失提交。

返回

返回此事务的后退堆栈条目的标识符, 如果 addToBackStack(String) 被调用。否则,返回 负数。

如果在执行事务时不调用 addToBackStack() 删除一个片段,然后在 事务已提交,用户无法导航回该事务。 然而,如果您在删除片段时确实调用了addToBackStack(), 然后片段将停止,如果用户导航,该片段将恢复 返回。

最新更新