【发布时间】:2021-04-05 17:40:00
【问题描述】:
我正在尝试使用 Navigation 组件实现循环逻辑,但我担心我做得不对,并且会不必要地调用生命周期方法。
我有 1 个包含 3 个片段的活动。片段之间的导航如下所示: A -> B -> C -> 回到 A 等等。
A 和 B 是常规片段,而 C 是 DialogFragment。 C 有两个按钮 - Cancel 和 Done。如果按下Cancel,则调用导航操作(使用findNavController().navigate(<action>)),应用程序将显示A。如果按下Done,则关闭C,应用程序将显示B,然后用户可以通过以下方式返回A压回去。这一切都按我的预期工作,但是......
我担心的是,返回 A 的每条路由都会导致在 A 中调用不同的生命周期方法。如果在用户接受 C 并按回 B 后导航返回 A,onCreateView()、onViewCreated() 和 onResume()由 A 调用。BUT,如果取消 C 后导航返回 A,A 会调用更多生命周期方法(onAttach().onCreate()、onCreateView()、onViewCreated、onResume() ,onDestroy(),onDetach())。为什么有区别?为什么在 A 中再次调用 onCreate()?它不应该只使用 A 的现有实例而不是创建一个新实例吗?
我不知道它为什么会这样,或者它是否是我应该关心的事情。我相信当用户在片段之间导航时,堆栈得到了适当的管理,因为 C 和 A 之间的导航操作使用 popUpTo 和 popUpToInclusive 属性(如文档中推荐的 here 那样)。我还尝试在 C 和 A 之间的操作中设置 launchSingleTop 属性,但我得到了相同的行为(在 A 中调用了额外的生命周期方法)。
这是 C 片段的 xml:
<dialog
android:id="@+id/C"
android:name="C"
... >
<action
android:id="@+id/C_to_A"
app:destination="@id/A"
app:popUpTo="@id/A"
app:popUpToInclusive="true" />
</dialog>
当用户按下 cancel 按钮时,我从 C 调用操作 C_to_A。
非常欢迎任何帮助消除我的困惑。
【问题讨论】:
-
您在操作中使用
app:destination是否有原因(而不是忽略它并使用popUpToInclusive="false"创建仅弹出操作)?使用app: destination意味着您正在创建A的新实例。 -
那我如何从 C 到 A?通过调用 findNavController().navigateUp() 两次?
-
嗯,很有趣。我只是尝试删除目标属性并将 popUpToInclusive 设置为 false,这似乎有效。 A 现在调用我期望的生命周期方法。我以为目的地是必需的?!谢谢@ianhanniballake
标签: android android-fragments android-lifecycle android-architecture-components android-architecture-navigation