JetPack之Navigation使用

作者: 奔跑吧李博 | 来源:发表于2021-04-22 11:42 被阅读0次

Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构。应用内Fragment页面的跳转则由 Navigation 来处理,开发者无需在处理 FragmentTransaction 的复杂性以及相关的转场动画。

在app的gradle.build中添加依赖:

    def nav_version = "2.3.5"

    // Kotlin
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

在activity布局文件中加入FragmentContainerView:

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"/>

name为固定写法,必须指明为

androidx.navigation.fragment.NavHostFragment

defaultNavHost字段表示是否拦截返回按键操作
若为true,需要的Activity中重写onSupportNavigateUp方法。
默认情况下返回键是不会回退fragment页面的,完成即可使用回退键返回fragment页面。

    override fun onSupportNavigateUp(): Boolean {
        //调用扩展函数findNavController
        return findNavController(R.id.nav_host_fragment).navigateUp()
    }

需要设置navGraph导航图文件,继续在res文件夹下创建nav_graph.xml文件,定义相关fragment和各自的跳转逻辑。

<?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/fragment_home">

    <fragment
        android:id="@+id/fragment_home"
        android:name="com.example.navigationuse.HomeFragment"
        tools:layout="@layout/fragment_home">

        <action android:id="@+id/fragment_home_to_fragment_msg"
            app:destination="@+id/fragment_msg"/>
    </fragment>

    <fragment
        android:id="@+id/fragment_msg"
        android:name="com.example.navigationuse.MsgFragment"
        tools:layout="@layout/fragment_msg">

        <action android:id="@+id/fragment_msg_to_fragment_home"
            app:destination="@+id/fragment_home"/>

        <action android:id="@+id/fragment_msg_to_fragment_mine"
            app:destination="@+id/fragment_mine"/>
    </fragment>

    <fragment
        android:id="@+id/fragment_mine"
        android:name="com.example.navigationuse.MineFragment"
        tools:layout="@layout/fragment_mine">

        <action android:id="@+id/fragment_mine_to_fragment_msg"
            app:destination="@+id/fragment_msg"/>
    </fragment>
</navigation>

导航图实现了3个fragment之间的前后跳转,设置要跳转的action。由于fragment代码简单,这里就不贴出来了。


跳转页面通过NavController来控制:

btnHome.setOnClickListener {
//通过传入action来实现导航              
Navigation.findNavController(btnHome).navigate(R.id.fragment_home_to_fragment_msg)
        }

跳转传递参数

            var args = Bundle()
            args.putString("params", "params")
            Navigation.findNavController(btnHome).navigate(R.id.fragment_home_to_fragment_msg, args)

目标页接收参数:

var params = arguments?.getString("params")

相关文章

网友评论

    本文标题:JetPack之Navigation使用

    本文链接:https://www.haomeiwen.com/subject/xvotrltx.html