如何从 ViewPager2 的 NavHostFragment 内的片段导航回来?

色雷斯人

从 ViewPager2 的嵌套片段导航回来的正确方法是什么?

尽管使用app:defaultNavHost="true"FragmentContainerView在页面的分片嵌套按后退按钮同时呼吁活动的背压,而不是导航回到以前的片段。

安汉尼巴拉克

根据创建 NavHostFragment 文档在首次添加 Fragment 时app:defaultNavHost="true"调用setPrimaryNavigationFragment()- 它将setPrimaryNavigationFragment()返回按钮按下事件自动路由到该片段。

在一个ViewPager2虽然,它是ViewPager2,负责创建和添加的片段。由于 Fragment 层次结构的每一层都需要作为主导航片段,通过 XML 添加子片段仍然不能解决缺失的链接:ViewPager2 中的 Fragment 需要作为主导航片段。

因此,当 Fragment 成为活动 Fragment 并调用setPrimaryNavigationFragment(). ViewPager2 1.1.0-alpha01 在 中添加了这个 API FragmentTransactionCallback,特别是onFragmentMaxLifecyclePreUpdated(),每当 Fragment 的生命周期状态发生变化时都会调用它:当它更改为 时RESUMED,该 Fragment 现在是活动 Fragment 并且应该成为主要导航 Fragment作为onPost回调的一部分

private class Adapter(parentFragment: Fragment) : FragmentStateAdapter(parentFragment) {
    init {
        // Add a FragmentTransactionCallback to handle changing
        // the primary navigation fragment
        registerFragmentTransactionCallback(object : FragmentTransactionCallback() {
            override fun onFragmentMaxLifecyclePreUpdated(
                    fragment: Fragment,
                    maxLifecycleState: Lifecycle.State
            ) = if (maxLifecycleState == Lifecycle.State.RESUMED) {
                // This fragment is becoming the active Fragment - set it to
                // the primary navigation fragment in the OnPostEventListener
                OnPostEventListener {
                    fragment.parentFragmentManager.commitNow {
                        setPrimaryNavigationFragment(fragment)
                    }
                }
            } else {
                super.onFragmentMaxLifecyclePreUpdated(fragment, maxLifecycleState)
            }
        })
    }

    // The rest of your FragmentStateAdapter...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章