Android Jetpack 导航组件Navigation使用入门

jetpack Navigation

  • 一、简介
  • 二、开始使用
    • 1、添加依赖:
    • 2、创建Fragment
    • 3、创建导航图
    • 4、执行跳转操作
    • 5、传参

一、简介

导航组件Navigation用于实现应用中的导航操作。。。(感觉说了一句废话)

Navigation由三个关键部分组成:导航图,NavHost,NavController

导航图: 导航图xml资源文件包含了导航相关的所有信息,包括导航目的地(指activity或fragment内容区域),以及操作(目的地之间的逻辑连接);
Android Jetpack 导航组件Navigation使用入门_第1张图片

NavHost: 用于显示导航目标的容器,导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。

NavController: 在 NavHost 中管理应用导航的对象。控制 NavHost 中目标内容的交换。

二、开始使用

使用Navigation实现Activity或Fragment之间的跳转操作

1、添加依赖:

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

// Feature module Support
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

// Testing Navigation
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

// Jetpack Compose Integration
implementation "androidx.navigation:navigation-compose:1.0.0-alpha08"

2、创建Fragment

创建LoginFragment和RegisterFragment,以及对应的xml布局文件。
在主布局文件中添加控件FragmentContainerView:

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

该控件就是显示Fragment的容器,
android:name属性用于指定NavHost实现类的名称,使用androidx.navigation.fragment.NavHostFragment就可以。
defaultNavHost="true" 表示拦截系统返回按钮。
app:navGraph属性指定要绑定的导航图
该控件的id属性是必须有的,否则会报错。

3、创建导航图

在res下创建navigation目录,在该目录下创建导航图xml资源文件。
在根标签< navigation >中添加< fragment >标签,指定id和name属性,name属性指定对应Fragment类。

在< fragment >标签下添加< action >标签,该标签就是跳转操作,指定id,以及destination要跳转到哪个fragment。

给根标签< navigation >添加app:startDestination属性,指定一开始显示的fragment。


<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_config"
    app:startDestination="@id/login_fragment">

    <fragment android:id="@+id/login_fragment"
        android:name="com.example.navigationdemo.fragment.LoginFragment">

        <action android:id="@+id/to_register_page"
            app:destination="@+id/register_fragment"/>

    fragment>

    <fragment android:id="@+id/register_fragment"
        android:name="com.example.navigationdemo.fragment.RegisterFragment">
    fragment>
   
navigation>

4、执行跳转操作

先在loginFragment布局文件中加入一个按钮用于跳转到registerFragment界面。在按钮点击事件中编写跳转代码:

//跳转到注册界面
findNavController().navigate(R.id.to_register_page)

执行跳转操作很容易,只要调用findNavController()方法获取NavController对象实例,然后调用navigate()方法就可以了,方法中传入要执行的action标签的id。

5、传参

使用Bundle进行数据传递,创建Bundle对象,将数据保存bundle中,将bundle对象作为第二个参数传递给navigate()方法

//传参
val bundle = Bundle()
bundle.putString("userName", userNameEt.text.toString())
findNavController().navigate(R.id.to_register_page,bundle)

在registerFragment中,调用成员变量arguments的getString()方法得到数据:

val userName = arguments?.getString("userName")

如果是跳转到一个Activity时,如何得到传递过来的数据呢?
在Activity中是没有arguments这个变量的,但我们可以通过intent来获取数据:

val userName = intent.getStringExtra("userName")

你可能感兴趣的:(Android,android,kotlin,jetpack,安卓)