文章目录
一.简介
二.优劣势
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:name | fragment完整路径 |
<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文件