【问题标题】:ViewPager swallows onBackPressed so FragmentContainerView cannot be navigated [duplicate]ViewPager 吞下 onBackPressed 所以 FragmentContainerView 无法导航[重复]
【发布时间】:2021-07-31 19:00:09
【问题描述】:

所以我有一个具有以下布局的应用程序

Activity -> ViewPager -> FragmentA -> FragmentContainerView -> FragmentB

FragmentContainerView 包含一个NavHostFragment,它使用nav_graph 显示FragmentB。 FragmentB 中有一个按钮,用于导航到 FragmentB 的新实例。所以导航图基本上只是一个有自身链接的片段。

现在,如果我的活动中直接有 FragmentContainerView,这可以正常工作。但是,如果我将 FragmentContainerView 放在 ViewPager 内的另一个片段中,则后退按钮不再允许我导航 FragmentB 导航图。

我在FragmentContainerView 上使用app:defaultNavHost="true",但它没有帮助。

知道我做错了什么,我能做些什么来解决它?

【问题讨论】:

    标签: android android-fragments navigation


    【解决方案1】:

    根据Fragment Manager guide:

    将导航结构视为一系列层,以activity为最外层,将每一层的子片段包裹在下面。每个层都必须有一个主导航片段。当 Back 事件发生时,最内层控制导航行为。一旦最内层不再有要从中弹回的片段事务,控制权就会返回到下一层,并重复此过程,直到您到达活动。

    因此,当app:defaultNavHost="true" 将FragmentA 中的NavHostFragment 设置为其层中的主要导航片段(FragmentA 的childFragmentManager 层)时,FragmentA 必须也 设置为主要导航片段,以便任何系统后退按钮事件都可以到达FragmentA。

    同一页面显示了如何做到这一点:

    要在片段事务中定义主导航片段,请在事务上调用setPrimaryNavigationFragment() 方法,传入其childFragmentManager 应具有主要控制权的片段实例。

    虽然ViewPager2 具有到allow you to set the primary navigation fragment to the current page 的API,但ViewPager1 没有这样的API(您绝对应该转向ViewPager2 的众多原因之一)。

    作为 ViewPager1 中的解决方法,FragmentA 可以将自己设置为 onResume() 中的主要导航片段:

    public fun onResume() {
        super.onResume()
        parentFragmentManager
            .beginTransaction()
            .setPrimaryNavigationFragment(this)
            .commit()
    }
    

    【讨论】:

    • 谢谢!我实际上使用 ViewPager2 .. 只是忘了提及它,因为我不记得其中有 2 个。但是,我无法让您链接中的任何代码正常工作..由于某种原因,您使用的任何函数或类型都没有在我的适配器中定义..我继承FragmentStateAdapter,例如registerFragmentTransactionCallback()是一个未解决的参考
    • 您是否使用该答案中特别提到的ViewPager2 1.1.0-alpha01?
    • 不,这似乎是问题所在!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多