片段删除导致崩溃

时间:2015-01-09 14:17:21

标签: android android-fragments

当用户按下设置按钮时,我显示设置片段。当用户从设置点击后退按钮时,我想删除它。

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

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)然后再次点击后退按钮

然后app崩溃了。但是为什么?

logcat的:

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)

2 个答案:

答案 0 :(得分:0)

基本上你提交相同的FragmentTransaction 两次

考虑异常消息:

  java.lang.IllegalStateException: commit already called

还要考虑:

public abstract int commit()

  

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

     

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

     

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

答案 1 :(得分:0)

  

如果在执行事务时未调用addToBackStack()   删除一个片段,然后该片段被破坏   事务已提交,用户无法导航回事务。   然而,如果你在删除片段时调用addToBackStack(),   然后片段停止并在用户导航时恢复   回来。