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

时间:2014-08-14 00:02:23

标签: java android android-fragments

我有一个包含几个嵌套片段的Activity。处理方向更改时遇到了很多麻烦。当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}

为什么我的片段会自动重建?我可以做些什么来强制活动重新加载,好像应用程序第一次启动时方向更改?这不是生命周期应该如何起作用吗?

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

2 个答案:

答案 0 :(得分:0)

  • FragmentManager负责管理片段和 将它们添加到活动的视图层次结构中。

  • FragmentManager处理两件事:

    • 片段列表。
    • 返回堆栈碎片事务。
  • 添加删除附加分离替换您使用Fragment Transactions的片段列表中的片段。

  • 当您使用findFragmentById()findFragmentByTag()向FragmentManager询问片段时,如果片段是 已经在列表中,FragmentManager将返回它。然后你可以 用它。

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

答案 1 :(得分:0)

你知道如果你背景一个应用程序,然后重新打开它?活动实例仍在那里,Bundle savedInstanceState填充了数据。这意味着操作系统正在从序列化状态而不是从头开始重新创建应用程序。

如果savedInstanceState不为空,您需要执行的操作就是使用FragmentManagerfindFragmentByTag