Android Navigation 组件(用于Fragment间的跳转)

用于解决Fragment之间的跳转,传参的问题

1添加依赖 (build.gradle):

复制代码
dependencies {
    def nav_version = "2.7.7" // 使用当前最新稳定版
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}

2创建导航地图

在 res/navigation/ 文件夹下新建一个 XML 文件(如 nav_graph.xml)

复制代码
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment"> <!-- 指定入口页面 -->

    <!-- 定义目标1:首页 -->
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.app.HomeFragment"
        android:label="Home"
        tools:layout="@layout/fragment_home">
        <!-- 定义从homeFragment到detailFragment的动作 -->
        <action
            android:id="@+id/action_home_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>

    <!-- 定义目标2:详情页 -->
    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.app.DetailFragment"
        android:label="Detail"
        tools:layout="@layout/fragment_detail" />
</navigation>

3设置导航宿主 (NavHostFragment):

在你的主 Activity 的布局文件 (activity_main.xml) 中,放置一个 "容器" (NavHostFragment)。

◦ 这个容器告诉 Navigation 组件:"在这个区域里显示的 Fragment,都由我来管理它们的进出和切换"。

复制代码
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 关键!NavHostFragment容器 -->
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment" <!-- 指定实现类是NavHostFragment -->
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true" <!-- 很重要!让这个NavHost处理系统返回键 -->
        app:navGraph="@navigation/nav_graph" /> <!-- 关联之前定义的导航图 -->
</FrameLayout>

4执行导航 (使用 NavController):

在 HomeFragment 中,当按钮被点击时,你需要找到 "导航仪" (NavController)。

这个导航仪知道当前在哪个位置 (NavHostFragment),也有一张地图 (nav_graph.xml)。你告诉它:"执行 action_home_to_detail 这个动作"。

Kotlin 示例 (在 Fragment 中):

复制代码
class HomeFragment : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val navController = findNavController() // 获取绑定到当前视图的NavController
        binding.goToDetailButton.setOnClickListener {
            // 使用导航控制器执行指定的导航动作
            navController.navigate(R.id.action_home_to_detail)
        }
    }
}

5 传递参数 (Arguments):

在导航图中定义参数:

复制代码
<fragment
    android:id="@+id/detailFragment"
    ... >
    <argument
        android:name="itemId"
        app:argType="integer" /> <!-- 定义需要接收一个整数参数 itemId -->
</fragment>

在发起导航时传递参数:

复制代码
binding.goToDetailButton.setOnClickListener {
    // 创建一个 Bundle 或使用 Safe Args (推荐,见下面概念)
    val bundle = bundleOf("itemId" to 12345)
    navController.navigate(R.id.action_home_to_detail, bundle)
}

在 DetailFragment 中获取参数:

复制代码
val itemId = arguments?.getInt("itemId") ?: 0 // 或者使用 Safe Args
相关推荐
一叶难遮天6 天前
快速入门HarmonyOS应用开发(一)
harmonyos·arkts·arkui·navigation·鸿蒙开发·鸿蒙5.0
迷曳4 个月前
21、鸿蒙Harmony Next开发:组件导航(Navigation)
前端·harmonyos·鸿蒙·navigation
NapleC7 个月前
HarmonyOS:Navigation实现导航之页面设置和路由操作
华为·harmonyos·navigation
wangz768 个月前
kotlin,jetpack compose 最简导航(navigation)案例学习
kotlin·navigation·jetpack compose
H.ZWei1 年前
鸿蒙ZRouter动态路由框架—服务路由
harmonyos·鸿蒙·navigation·router
特立独行的猫a1 年前
HarmonyOS NEXT的Navigation,跳转子页面后底部Tab不隐藏问题解决
开发语言·前端·javascript·harmonyos·navigation
大熊猫侯佩1 年前
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
list·swiftui·form·列表·navigation·导航·picker
梁辰兴1 年前
Android Studio 使用插件Database Navigation 连接 sqlite数据库
数据库·sqlite·android studio·database·navigation·plugins
许三多20201 年前
Compose Navigation快速入门
compose·navigation·compose 导航