You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Navigation Controller与FragmentContainerView管理嵌套导航流程?

使用Navigation Controller实现指定导航流程

前提准备

确保项目已集成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

  1. 先在landing_fragment.xml布局中添加ViewPager:
<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 在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,直接通过导航控制器触发跳转即可,同时可传递列表项数据:

  1. 先启用Safe Args(方便参数传递),在项目级build.gradle添加插件:
dependencies {
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7"
}

模块级build.gradle中应用插件:

plugins {
    id 'androidx.navigation.safeargs.kotlin'
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:00:48