以编程方式嵌套的片段不反映导航上的父生命周期

Posted

技术标签:

【中文标题】以编程方式嵌套的片段不反映导航上的父生命周期【英文标题】:programatically nested fragments do not mirror parents lifecycle on navigation 【发布时间】:2020-08-23 22:42:35 【问题描述】:

希望有人可以在这里帮助我,

我有两个非常简单的片段设置为 NavHostFragment 的目的地,我正在使用如下导航在它们之间移动:

findNavController().navigate(R.id.action_fragment1_to_fragment2)

Fragment one 是使用以下方法动态地向自身添加一个片段:

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) 
            var fragment = SubFragment()
            val fm = requireActivity().supportFragmentManager
            val ft = fm
                .beginTransaction()
                .add(R.id.container, fragment)
                .commit()
        
    

当我单击以从 Fragment 1 导航到 Fragment 2 时,我可以看到 Fragment 1 按预期经历了 onPaused、onStop 和 onDestoryView。但我没有得到子片段的匹配调用。而如果我将子片段切换为通过 XML 静态添加,它会反映删除时的生命周期调用。我是否需要手动触发动态片段的生命周期,如果需要如何?

片段 1 布局


    <androidx.appcompat.widget.AppCompatTextView
        android:layout_
        android:layout_
        android:id="@+id/fragOneHead"
        android:text="Fragment One"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/fragOneHead"
        android:orientation="vertical" />

【问题讨论】:

【参考方案1】:

所以我的错误是我使用的是

 val fm = requireActivity().supportFragmentManager

据我了解,这将使片段具有与活动相同的生命周期,而不是片段 1。正确的方法是:

val fm = childFragmentManager

希望这对其他人有帮助

【讨论】:

以上是关于以编程方式嵌套的片段不反映导航上的父生命周期的主要内容,如果未能解决你的问题,请参考以下文章

导航架构片段重载问题

vue嵌套组件的生命周期

Android 片段生命周期

以编程方式设置 UIViewController 的视图和生命周期

在不存在的片段上调用片段生命周期和 onCreate 的问题

什么是生命周期感知方式来实现重复的AsyncTask?