android Jetpack--Navigation

文章目录

    • 一.简介
    • 二.优劣势
      • 2.1 优势
      • 2.2 劣势
    • 三.使用
      • 3.1 引入依赖
      • 3.2 创建三个fragment
      • 3.3 编写navigation xml跳转流程
      • 3.4 根据跳转流程编写跳转代码和传参
      • 3.5 将NavHostFragment放到activity中
    • 四.Safe Args安全传值
      • 4.1 配置
      • 4.2 传值
      • 4.3 接收传值

一.简介

Navigation是一个可简化的Android导航的库和插件,换句话说,通过可视化的方式来进行管理的。

二.优劣势

2.1 优势

  • 处理Fragment的切换
  • 默认情况下正确处理Fragment的前进和后退
  • 为过渡和动画提供标准化的资源
  • 可以绑定Toolbar/BottomNavigationView/ActionBar等
  • 数据传递时提供类型安全性(使用SafeArgs)
  • ViewModel支持

2.2 劣势

  • fragment切换后底层会调用replace方法导致会被不断销毁,无法保存上一次的状态

三.使用

3.1 引入依赖

dependencies {
  val nav_version = "2.4.0"

  // Java language implementation
  implementation("androidx.navigation:navigation-fragment:$nav_version")
  implementation("androidx.navigation:navigation-ui:$nav_version")

  // 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:2.5.0-alpha01")
}

3.2 创建三个fragment

这里创建三个fragment WelcomeFragment RegisterFragment LoginFragment
我们设想的是这样在welcomefragment中写两个按钮 第一个跳转到RegisterFragment ,第二个跳转到LoginFragment并传递参数
android Jetpack--Navigation_第1张图片

3.3 编写navigation xml跳转流程

首先创建navigation文件
在res目录右键选择new -> Android Resource File name自己设定 类型选择navigation
android Jetpack--Navigation_第2张图片

然后依据上面的设想我们编写了如下的navigation的代码

<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/welcomeFragment">
    <fragment
        android:id="@+id/loginFragment"
        android:name="com.jidian.practice.ui.fragment.LoginFragment"
        android:label="LoginFragment">
        <argument
            android:name="loginInfo"
            android:defaultValue=""
            app:argType="string" />
    fragment>
    <fragment
        android:id="@+id/registerFragment"
        android:name="com.jidian.practice.ui.fragment.RegisterFragment"
        android:label="RegisterFragment">fragment>
    <fragment
        android:id="@+id/welcomeFragment"
        android:name="com.jidian.practice.ui.fragment.WelcomeFragment"
        android:label="WelcomeFragment">
        <action
            android:id="@+id/action_welcomeFragment_to_registerFragment"
            app:destination="@id/registerFragment" />
        <action
            android:id="@+id/action_welcomeFragment_to_loginFragment"
            app:destination="@id/loginFragment" />
    fragment>
navigation>

针对如上的代码进行参数的详解

名称 含义
/ 文件必须以开头,以结尾,标识这是一个Navigation文件
app:startDestination 默认的起始的fragment所对应的id,此处意味着WelcomeFragment作为起始的Fragment
Navigation所操作的都是Fragment
对应的Fragment的id
fragment完整路径
对应的fragment布局
对应的跳转动作
传参
传参的key
传参的默认值
传参类型

3.4 根据跳转流程编写跳转代码和传参

从welcomefragment跳转到registerfragment不需要传参
在这里插入图片描述
从welcomefragment到loginfragment需要传参
android Jetpack--Navigation_第3张图片
其中id就是我们在navigation文件中设置的fragment的id

3.5 将NavHostFragment放到activity中

最后一步就是NavHostFragment放到activity中
在activity的布局文件中添加


<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <fragment
        android:id="@+id/welcome_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" />

androidx.constraintlayout.widget.ConstraintLayout>

其中name是固定的
navGraph就是索引的3.3创建的navigation文件

四.Safe Args安全传值

4.1 配置

根部build中添加classpath

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.4.0"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

配置id

//java
plugins {
    id("androidx.navigation.safeargs")
}
//kotlin
plugins {
    id("androidx.navigation.safeargs.kotlin")
}

编写navigation文件中的传值标签

 <fragment
        android:id="@+id/RegisterFragment"
        android:name="com.jidian.practice.ui.fragment.RegisterFragment"
        android:label="RegisterFragment">
        <argument
            android:name="name"
            android:defaultValue=""
            app:argType="string" />
    fragment>

点击 Make Project
在这里插入图片描述
这样就在app-build-generated-source-navigation-args下生成了配置文件

4.2 传值

val name = RegisterFragmentArgs.Builder().setName("hahah").build().toBundle()
            findNavController().navigate(R.id.RegisterFragment,name)

4.3 接收传值

var bundle = arguments
        if (bundle != null) {
            val name = RegisterFragmentArgs.fromBundle(bundle).name
            text.setText(name)
        }

你可能感兴趣的:(kotlin,jetpack,android,jetpack,android,ui)