【问题标题】:Android Fragments not being recreated on Activity RestartActivity Restart 时未重新创建 Android 片段
【发布时间】:2014-08-14 00:02:23
【问题描述】:

我有一个包含几个嵌套片段的活动。我在处理方向变化时遇到了很多麻烦。当 Activity 尝试重新创建自身导致应用程序崩溃时,某些事情是不正确的。如果我尝试在方向更改期间调试代码,则应用程序崩溃,而 logcat 中没有任何消息。

我的问题似乎是运行时试图在我不希望的情况下在我的 Activity 中重新创建片段。没有一个片段有 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,首先要非常仔细地查看您的代码和布局。
  • 据我所知。如果我将方向限制为纵向或横向,一切正常。如果 onCreateView 代码中有问题,那么我不明白为什么它没有被 catch 块捕获。我不明白为什么会自动重新创建片段,而不是在原始状态下重新创建活动,然后从那里重新加载片段。
  • “如果需要,我可以添加任何代码。”:这就是我们在这里的工作方式。除非您显示用于创建 ActivityFragments 的代码,否则很难给出解决方案。

标签: java android android-fragments


【解决方案1】:
  • FragmentManager 负责管理片段和 将它们添加到活动的视图层次结构中。

  • FragmentManager 处理两件事:

    • 片段列表。
    • 片段交易的回栈。
  • 添加删除附加分离替换 您使用的片段列表中的片段Fragment Transactions

  • 当您使用findFragmentById()findFragmentByTag() 向 FragmentManager 请求片段时,如果片段是 已经在列表中,FragmentManager 将返回它。那么你就可以 使用它。

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

【讨论】:

  • 看起来如果我删除后台堆栈中的最后一项(如果有的话)我可以重新加载我的活动而不会崩溃。我应该能够从那里重新创建需要的片段。我试试看
【解决方案2】:

您知道将应用程序设置为后台然后重新打开它会怎样吗? Activity 实例仍然存在,Bundle savedInstanceState 填充了数据。这意味着操作系统正在从序列化状态而不是从头开始重新创建您的应用程序。

如果savedInstanceState 不为空,您需要做的是查看使用您的FragmentManagerfindFragmentByTag

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多