Android片段在Activity重新启动时未被重新创建

3
我有一个包含几个嵌套片段的活动。我一直在处理方向变化时遇到的问题。当活动尝试重新创建自身时,出现了错误,导致应用程序崩溃。如果我在方向更改期间调试代码,则应用程序会崩溃,而logcat中没有任何消息。
我的问题似乎是运行时正在尝试重新创建我不想要的活动中的片段。没有任何片段设置了setRetainInstance(true),因此它们不应该被保留。
我已将日志记录添加到Activity和Fragments的onCreate和onDestroy方法中。当应用程序首次运行时,我得到以下输出:
Activity onCreate
Fragment1 onCreate
Fragment1 onCreateViewStart
Fragment1 onCreateViewEnd
Fragment2 onCreate
Fragment2 onCreateViewStart
Fragment2 onCreateViewEnd

我随后旋转设备,出现了以下内容:
Fragment1 onDestroy
Fragment2 onDestroy
Activity onDestroy
Fragment1 onCreate
Fragment2 onCreate
Activity onCreate
Fragment1 onCreateViewStart
Fragment1 onCreateViewEnd
Fragment2 onCreateViewStart
Fragment2 onCreateViewEnd
Fragment2 onDestroy
Fragment2 onCreate

在上面的最后一条消息之后,应用程序崩溃,并显示以下异常消息:
E/FragmentManager(32258): No view found for id 0x7f0a0047 (com.appName:id/fragmentHolder) for fragment Fragment2{6529b910 #6 id=0x7f0a0047 16002}

为什么我的碎片会自动重新创建?当方向改变时,有没有办法强制活动重新加载,就像应用程序第一次启动一样?这不是生命周期本来应该工作的方式吗?

如果需要,我可以添加任何代码。


资源/布局是否正确?onCreateView的逻辑是否正确?我不会怪Android,而是会非常仔细地查看你的代码和布局。 - Volodymyr Lykhonis
据我所知,它们是这样的。如果我将方向限制为纵向或横向,则一切正常。如果在onCreateView代码中存在问题,那么我不明白为什么它没有被catch块捕获。我不理解的是为什么片段会自动重新创建,而不是重新创建活动以其原始状态,然后从那里重新加载片段。 - ChrisW
如果需要,我可以添加任何代码。这就是我们在这里的工作方式。除非您展示用于创建“Activity”和“Fragments”的代码,否则很难提供解决方案。 - Squonk
2个回答

1
  • FragmentManager 负责管理碎片并将它们添加到活动的视图层级中。

  • FragmentManager 处理两件事:

    • 一个碎片列表。
    • 碎片事务的后退栈。
  • 要在碎片列表中 添加删除附加分离替换 碎片,您可以使用 Fragment Transactions

  • 当您使用 findFragmentById()findFragmentByTag() 请求 FragmentManager 的碎片时,如果碎片已经在列表中,则 FragmentManager 会返回它。然后您可以使用它。

知道这些,如果在方向更改发生时向 FragmentManager 的列表中添加了片段,那么这些片段将自动重新创建,以便在方向更改之前重建视图层次结构。如果您不想要一个片段被重新创建,请使用片段事务将其从列表中删除。


看起来如果我移除回退栈中的最后一个项目(如果有的话),我就能够重新加载我的活动而不会崩溃。我应该能够从那里重新创建所需的片段。我会尝试一下。 - ChrisW

0

你知道如果你将一个应用程序放到后台,然后重新打开它会发生什么吗?Activity实例仍然存在,并且Bundle savedInstanceState中包含数据。这意味着操作系统是从序列化状态重新创建您的应用程序,而不是从头开始。

savedInstanceState不为空的情况下,您需要使用FragmentManagerfindFragmentByTag


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接