【问题标题】:When would Fragment's onDestroyView be called, but it wouldn't be destroyed?Fragment 的 onDestroyView 什么时候会被调用,但它不会被销毁?
【发布时间】:2014-05-11 14:44:25
【问题描述】:

查看片段的生命周期,我不确定这里可能发生的情况。 当 Fragment 停止活动时,有两种可能的方法。

  1. 调用适当的回调,销毁视图,然后销毁片段
  2. 调用回调,销毁视图,但让片段本身保持活动状态

这两种选择中的哪一种是在什么情况下完成的?是什么决定了他们中的哪一个? 如果一个片段被添加到后台堆栈,然后被移除/替换,为什么不把它扔掉呢?为什么要保留它?

编辑:我突然想到,这是否取决于片段是否保留?

【问题讨论】:

标签: android android-fragments


【解决方案1】:

这似乎都取决于片段是否被保留。当fragment被保留的时候,那么onDestroyView之后就是onCreateView。

当片段被保留(即 setRetainInstance(true))时,旋转设备时的日志如下所示:

com.example.FragmentLifecycleTestApp W/MainFragment﹕ onAttach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreate
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreateView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onActivityCreated
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStart
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onResume
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onPause
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStop
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onDestroyView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onDetach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onAttach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreateView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onActivityCreated
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStart
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onResume

但是当它不保留时,它是这样的:

com.example.FragmentLifecycleTestApp W/MainFragment﹕ onAttach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreate
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreateView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onActivityCreated
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStart
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onResume
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onPause
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStop
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onDestroyView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onDestroy
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onDetach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onAttach
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreate
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onCreateView
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onActivityCreated
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onStart
com.example.FragmentLifecycleTestApp W/MainFragment﹕ onResume

【讨论】:

  • 非常感谢setRetainInstance(true) 的想法!就我而言,它导致onDestroyView 在关闭带有片段的活动时没有调用。当从旧实例重新打开该活动 onDestroyView 时,在新实例的 onCreateView 之后调用。
  • @ArtemMostyaev,嘿,我需要你的小帮助我也面临同样的问题,旧实例的 onDestroyView 在新实例的 onCreateView 之后被调用。你能建议我解决这个问题的方法吗
  • @Vivek 不要过分依赖onDestroyView。它很少使用,因为所有未使用的对象都可以由 GC 自动收集。如果你真的需要它,你可以将你的代码移动到onPause 并使用onPause/onResume 对来保存/加载状态。
【解决方案2】:

看图:

这是所有生命周期状态的显式可视化。享受吧。

【讨论】:

    【解决方案3】:

    片段被保留时(即setRetainInstance(true)),

    如果 setRetainInstance(true) 则:- OnDestroy() 不被调用 然后再次打开 fagemnt 然后不调用 onCreate()

    但是当 setRetainInstance(false) :- 然后片段所有生命周期被调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多