【问题标题】:How can I navigate to other fragment from ViewPager's fragment using Jetpack Navigation Component?如何使用 Jetpack 导航组件从 ViewPager 的片段导航到其他片段?
【发布时间】:2022-05-15 16:22:04
【问题描述】:

我有一个应用程序。 它基于 Android Jetpack Navigation 组件,并具有带有 ViewPager 的 Tab UI。

例如,有片段作为 Tab UI。 (不是底部导航界面)

  • MainFragment:这包含 3 个 Tab 片段作为 Tab 和 ViewPager。
  • DetailsFragment

这 2 个片段存在于 nav_graph.xml 中。

和其他人:

  • TabAF 片段
  • TabBF 片段
  • TabCF 片段

nav_graph.xml 中不存在这 3 个片段

我想知道如何从 TabXFragment 导航到 DetailsFragment。

其实导航并不难。 是一样的。 我可以通过调用“findNavController.navigate()”进行导航。

但问题是“返回”按钮。

当我触摸 DetailsFragment 上的“返回”按钮时,它显示奇怪的屏幕。 只是白屏。 没有 TabView。

我预计它会显示 TabXFragment。 但它没有......

所以我使用 Activity 而不是 DetailsFragment 解决了这个问题。 但我想知道我该如何处理这个问题...

(对不起,我的英语水平不好)

【问题讨论】:

  • 您介意分享一下您是如何从 ViewPager 导航到 DetailsFragment 的吗?当我设置它时,片段管理器抱怨片段已经添加并崩溃。我认为它是为适配器添加一次,然后从 nav_graph 中添加一次。如何设置 navgraph 以了解 Tab A 可以导致 DetailsFrag 而 Tab B 也可以这样做,或者有不同的操作?

标签: android android-fragments navigation android-jetpack-navigation


【解决方案1】:

我用过这个方法,对我有用

只需在 MainFragment 中使用ViewPager2,如下代码所示

 val adapter =ViewPagerAdapter(childFragmentManager,lifecycle)
 adapter.addFragment(TabAFragment(),"A")
 adapter.addFragment(TabAFragment(),"B")
 adapter.addFragment(TabAFragment(),"C")
 binding.viewpager.adapter =adapter
 adapter.notifyDataSetChanged()

然后在您的导航图中创建从 MainFragment 到 DetailsFragment 的路由

在您的 ViewPager 片段(如 TabAFragment)中,只需从 MainFragment 导航到 DetailsFragment

别忘了添加如下适配器

class ViewPagerAdapter (manager: FragmentManager, lifecycle: Lifecycle) :  FragmentStateAdapter(manager,lifecycle ){
    private val fragmentList : MutableList<Fragment> =ArrayList()
    private val titleList : MutableList<String> =ArrayList()
    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return  fragmentList[position]
    }


    fun addFragment(fragment: Fragment, title: String){
        fragmentList.add(fragment)
        titleList.add(title)
    }

    fun getPageTitle(position: Int): CharSequence? {
        return titleList[position]
    }
}

最后在您的 DetailsFragment 中使用下面的代码来完成当前片段

findNavController().popBackStack()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多