当用户按下设置按钮时,我显示设置片段。当用户从设置点击后退按钮时,我想删除它。
当用户点击设置按钮时,我正在运行以下代码:
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)
答案 0 :(得分:0)
基本上你提交相同的FragmentTransaction
两次。
考虑异常消息:
java.lang.IllegalStateException: commit already called
还要考虑:
public abstract int commit()
在API级别11中添加计划此事务的提交。该 提交不会立即发生;它将被安排作为工作 下一次线程就绪时要完成的主线程。
事务只能在此方法之前使用此方法提交 包含活动保存其状态。 如果之后尝试提交 那一点,将抛出异常。这是因为国家 如果需要从中恢复活动,则可能会丢失提交 它的国家。有关可能的情况,请参阅commitAllowingStateLoss() 可以丢失提交。
返回返回此事务的后栈条目的标识符, 如果已调用addToBackStack(String)。否则,返回一个 负数。
答案 1 :(得分:0)
如果在执行事务时未调用addToBackStack() 删除一个片段,然后该片段被破坏 事务已提交,用户无法导航回事务。 然而,如果你在删除片段时调用addToBackStack(), 然后片段停止并在用户导航时恢复 回来。