目录
在日常开发中,越来越多的会使用到一个activity嵌套多个fragment的场景。
使用Navigation组件,就可以很方便的管理多个Fragment。
https://developer.android.google.cn/guide/navigation?hl=bn#kts (这是google官方的文档)
官方的文档比较晦涩,我就给大家介绍一下最简单的Navigation如何使用
在最后放了一个视频展现效果
一.添加依赖
//navigation添加依赖
val nav_version = "2.7.7"
// 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:$nav_version")
把这一串添加在build.gradle文件下,然后点击右上角的Sync Now
(按照这张截图添加)
二.创建、修改Fragment
1.创建
我创建了三个fragment分别为1,2,3
2.修改
2.1.kt文件
把不需要的代码删一删,变成这样(以Fragment2为例)
修改
return inflater.inflate(R.layout.fragment_2, container, false)
改成
var view = inflater.inflate(R.layout.fragment_2, container, false)
return view
这样就可以直接在return前写点击事件了
2.2.xml文件
修改每个fragment的布局文件(以fragment2为例)
我放了一个TextView用于区分不同的fragment
放置两个button用于控制前进和返回
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".Fragment2">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment222"
android:textSize="50sp"/>
<Button
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="next"/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="back"/>
</androidx.appcompat.widget.LinearLayoutCompat>
三.创建navigation导航
右键res,按照图片选择
选择navigation,点击ok
接着,在新创建的navigation包中创建
我取名为nav_example,点击ok
创建完成,会看到是这样
点击这个标红的图标,就可以添加fragment
添加三个fragment完成后,会看到每一个图的右边带有一个小点,
按照你需要的顺序,把小点连出去
点击右上角code栏,就可以看到生成了如下代码
(按照前面的步骤来,就都是自动生成)
app:startDestination="@id/fragment1"
这句代码的意思是默认启动的第一个界面是fragment1
四.添加NavHostFragment
在activity的布局文件中配置
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
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/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintVertical_bias="1.0"
app:navGraph="@navigation/nav_example" />
</androidx.appcompat.widget.LinearLayoutCompat>
这样fragment1中的布局就可以在activity中显示了
(这几句非常重要)
android:name为指定NavHostFragment
app:navGraph为指定导航视图,即建好的nav_emample.xml
app:defaultNavHost=true 意思是可以拦截系统的返回键,可以理解为默认给fragment实现了返回键的功能,这样在fragment的跳转过程中,当我们按返回键时,就可以使得fragment跟activity一样可以回到上一个页面了
五.NavController 管理fragment
以Fragment2为例(因为1中只有前进,3中只有后退)
package com.example.navigation
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.navigation.Navigation
class Fragment2 : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
var view = inflater.inflate(R.layout.fragment_2, container, false)
var next: Button = view.findViewById(R.id.next)
var back: Button = view.findViewById(R.id.back)
//next点击事件
next.setOnClickListener(){
val navController = Navigation.findNavController(it)
navController.navigate(R.id.action_fragment2_to_fragment3)
}
//back点击事件
back.setOnClickListener(){
//销毁当前fragment
val navController = Navigation.findNavController(it).popBackStack()
}
return view
}
}
很简单,在Fragment1中只需要加next,在Fragment3中只需要加back
到这步就完成了
六.效果
可以看到,点击系统的返回键也是回到上一个fragment而不是直接退出activity
Navigation 效果