0
点赞
收藏
分享

微信扫一扫

android Jetpack--Navigation

凌得涂 2022-02-08 阅读 67

文章目录

一.简介

二.优劣势

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并传递参数
在这里插入图片描述

3.3 编写navigation xml跳转流程

首先创建navigation文件
在res目录右键选择new -> Android Resource File name自己设定 类型选择navigation
在这里插入图片描述

然后依据上面的设想我们编写了如下的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>/</navigation>文件必须以开头,以结尾,标识这是一个Navigation文件
app:startDestination默认的起始的fragment所对应的id,此处意味着WelcomeFragment作为起始的Fragment
<fragment>Navigation所操作的都是Fragment
<fragment android:id对应的Fragment的id
<fragment android:namefragment完整路径
<fragment android:layout对应的fragment布局
<fragment <action对应的跳转动作
<fragment <argument传参
<argument android:name传参的key
<argument android:defaultValue传参的默认值
<argument app:argType传参类型

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

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

3.5 将NavHostFragment放到activity中

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

<?xml version="1.0" encoding="utf-8"?>
<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文件

举报

相关推荐

0 条评论