如何借助Navigation Controller与FragmentContainerView管理嵌套导航流程?
前提准备
确保项目已集成Navigation组件,在模块级build.gradle中添加依赖:
dependencies { implementation "androidx.navigation:navigation-fragment-ktx:2.7.7" implementation "androidx.navigation:navigation-ui-ktx:2.7.7" }
步骤1:创建Navigation Graph
在res/navigation目录下创建nav_graph.xml,定义所有需要的Fragment及跳转Action:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph" app:startDestination="@id/landingFragment"> <!-- 起始页面:Landing Fragment --> <fragment android:id="@+id/landingFragment" android:name="com.yourpackage.LandingFragment" android:label="Landing Fragment"> <!-- 跳转到Archive Fragment的Action --> <action android:id="@+id/action_landing_to_archive" app:destination="@id/archiveFragment" /> <!-- 跳转到List Detail Fragment的Action,支持参数传递 --> <action android:id="@+id/action_landing_to_list_detail" app:destination="@id/listDetailFragment"> <argument android:name="itemData" app:argType="com.yourpackage.ListItem" /> </action> </fragment> <fragment android:id="@+id/archiveFragment" android:name="com.yourpackage.ArchiveFragment" android:label="Archive Fragment" /> <fragment android:id="@+id/listDetailFragment" android:name="com.yourpackage.ListDetailFragment" android:label="List Detail Fragment" /> </navigation>
步骤2:在Landing Fragment中集成ViewPager
- 先在
landing_fragment.xml布局中添加ViewPager:
<androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" />
- 在LandingFragment代码中配置PagerAdapter,加载ListOneFragment:
class LandingFragment : Fragment() { private lateinit var viewPager: ViewPager override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.landing_fragment, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewPager = view.findViewById(R.id.viewPager) // 配置PagerAdapter,加载ListOneFragment viewPager.adapter = object : FragmentPagerAdapter(childFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getCount(): Int = 1 // 仅加载ListOneFragment,数量设为1 override fun getItem(position: Int): Fragment = ListOneFragment() } } }
步骤3:实现方形框跳转到Archive Fragment
在LandingFragment的onViewCreated方法中,给方形框View添加点击事件,通过导航控制器跳转:
// 找到方形框View(替换成你的实际ID) val squareBox = view.findViewById<View>(R.id.square_box) squareBox.setOnClickListener { // 触发跳转Action findNavController().navigate(R.id.action_landing_to_archive) }
步骤4:实现列表项跳转到List Detail Fragment
因为ListOneFragment是LandingFragment的子Fragment,直接通过导航控制器触发跳转即可,同时可传递列表项数据:
- 先启用Safe Args(方便参数传递),在项目级
build.gradle添加插件:
dependencies { classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7" }
模块级build.gradle中应用插件:
plugins { id 'androidx.navigation.safeargs.kotlin' }
- 在ListOneFragment中处理列表项点击:
class ListOneFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val recyclerView = view.findViewById<RecyclerView>(R.id.list_recycler) // 假设ListAdapter是自定义的列表适配器,点击回调传入列表项数据 recyclerView.adapter = ListAdapter { item -> // 通过Safe Args生成的Action传递参数 val action = LandingFragmentDirections.actionLandingToListDetail(item) findNavController().navigate(action) } } }
关键配置:Activity中设置NavHostFragment
确保主Activity的布局中包含NavHostFragment,作为导航容器:
<!-- activity_main.xml --> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" />
内容的提问来源于stack exchange,提问作者Krunal Pandav
相关产品推荐
相关产品推荐

