如何从ViewPager2的NavHostFragment内部的片段导航回来? [英] How to navigate back from fragments inside NavHostFragment of ViewPager2?

查看:128
本文介绍了如何从ViewPager2的NavHostFragment内部的片段导航回来?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

What is the proper way of navigating back from nested fragments of ViewPager2?

尽管使用 app:defaultNavHost ="true" FragmentContainerView ,但在页面的嵌套片段中按下后退"按钮时,会调用Activity的后退键,而不是导航回上一个片段.

Despite using app:defaultNavHost="true"with FragmentContainerView pressing back button while in a nested fragment of a page calls Activity's back press instead of navigating back to previous fragment.

推荐答案

按照调用

As per the Create a NavHostFragment documentation, app:defaultNavHost="true" calls setPrimaryNavigationFragment() when the Fragment is first added - it is setPrimaryNavigationFragment() that routes back button press events to that fragment automatically.

尽管在 ViewPager2 中,是ViewPager2负责创建和添加Fragment.由于Fragment层次结构的每个级别都必须是主要的导航片段,因此通过XML添加子片段仍然不能解决缺少的链接:ViewPager2中的Fragment必须是主要的导航片段.

In a ViewPager2 though, it is the ViewPager2 that is responsible for creating and adding the Fragment. Since every level of the Fragment hierarchy needs to be the primary navigation fragment, adding a child fragment via XML still doesn't solve the missing link: that the Fragment in the ViewPager2 needs to be the primary navigation fragment.

因此,您需要挂接回调,以了解何时将Fragment制成活动Fragment,并调用 setPrimaryNavigationFragment(). ViewPager2 1.1.0-alpha01 完全添加了此API在 FragmentTransactionCallback 中, onFragmentMaxLifecyclePreUpdated() ,只要Fragment的生命周期状态发生更改,就会调用该代码:将其更改为 RESUMED 时,该Fragment现在是活动片段,应该成为主要导航片段,作为 onPost 回调的一部分.

Therefore, you need to hook into the callbacks for when a Fragment is made the active Fragment and call setPrimaryNavigationFragment(). ViewPager2 1.1.0-alpha01 adds exactly this API in the FragmentTransactionCallback, specifically, the onFragmentMaxLifecyclePreUpdated(), which is called whenever the Lifecycle state of a Fragment is changed: when it is changed to RESUMED, that Fragment is now the active fragment and should become the primary navigation Fragment as part of the onPost callback.

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...
}

这篇关于如何从ViewPager2的NavHostFragment内部的片段导航回来?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆