【问题标题】:Fragment remove causes crash片段删除导致崩溃
【发布时间】:2016-11-20 03:07:09
【问题描述】:

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

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

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

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

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)

【问题讨论】:

标签: android android-fragments


【解决方案1】:

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

考虑异常消息:

  java.lang.IllegalStateException: commit already called

还要考虑:

public abstract int commit()

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

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

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

【讨论】:

  • 感谢您提供的信息。您对这份工作有什么建议?
  • 新建FragmentTransaction getFragmentManager().beginTransaction().remove(fragment);
【解决方案2】:

如果您在执行事务时没有调用 addToBackStack() 删除一个片段,然后当 事务已提交,用户无法导航回它。 然而,如果您在删除片段时调用 addToBackStack(), 然后片段停止并在用户导航时恢复 返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多