2015-06-05 65 views
0

现在我有一个片段可以持续很长时间。在某些情况下,活动将在片段仍在运行时调用onSaveInstanceState。片段完成后,我想关闭它。这里会抛出一个异常Can not perform this action after onSaveInstanceState如何正确关闭片段?

我知道它是什么意思,但我确实需要在完成某些事情后关闭片段。因此,如果我使用commitAllowingStateLoss强制片段关闭,在活动重新创建后,close state将不会被重新创建,UI将被破坏。

那么我该如何正确关闭片段?

+0

你能否指定你在片段中做了哪种工作? – dkarmazi

+0

@dkarmazi喜欢下载或其他。 – zzy

回答

1

我不知道任何安全的方式来自动关闭片段,这似乎是一个坏主意(为什么你会依赖于这个系统?)。你将不得不在你的应用程序中正确使用它。我可以给你代码建议去做。由于没有密切的方法,您可以使用remove方法,或使用popBackStack。既然你没有发布任何代码,我建议采用一种通用的方式来做到这一点。使用除去

代码建议:

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 
... 
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 

transaction.remove(fragment); 
transaction.commit(); 

注:

  • TAG_FRAGMENT是在布局中片段的ID。
  • findFragmentByTag()是一种方法,另一种是新的myFragment();
  • 如果您需要时间关闭片段,请使用onDetach()覆盖片段的方法。
+0

如果片段关闭时需要时间,也可以使用onDetach of Fragment。 –

+0

我知道'FragmentTransaction',但我的问题是如何在调用onSaveInstanceState时提交这样的删除函数。 'commitAllowingStateLoss'可强制执行'remove'功能,但不会让'State'保存这个'remove state'。 – zzy

+0

@zzy,首先你没有明确说出重写onSaveInstanceState()的原因。是的,即使在该方法之前,您的片段仍可能正在运行。但是那真正的问题是什么?如果你的片段需要将数据传递给Activity,那么你可以在Fragment的onDetach()中传递数据。我在我的帖子中提到过。 –