导入依赖
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.navigation:navigation-runtime-ktx:2.5.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.0'
根据需要创建几个Fragment及Fragment对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="register" />
</LinearLayout>
package com.example.wanandroid.ui.fragment
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.example.wanandroid.R
class RegisterFragment: Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_register,container,false)
}
}
创建导航关系图
1.创建Navigation目录
res资源目录右键新建目录


2.创建xml 文件,用来存放fragment 之间的路由关系


3.编写nav_login.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_login"
app:startDestination="@id/loginFragment">
<fragment
android:id="@+id/loginFragment"
android:name="com.example.wanandroid.ui.fragment.LoginFragment"
android:label="LoginFragment">
<action
android:id="@+id/action_loginFragment_to_registerFragment"
app:destination="@id/registerFragment" />
</fragment>
<fragment
android:id="@+id/registerFragment"
android:name="com.example.wanandroid.ui.fragment.RegisterFragment"
android:label="RegisterFragment" />
</navigation>
4.最终结构如下图:

标签属性说明

创建activity容器
方式一之xml使用默认知道加载页面且不传参
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_login"/>
</LinearLayout>
activity中:
package com.example.wanandroid.ui
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.Navigation
import com.example.wanandroid.R
class LoginActivity: BaseCompatActivity() {
lateinit var navController: NavController
override fun getLayoutId(): Int {
return R.layout.activity_login
}
override fun initView(savedInstanceState: Bundle?) {
navController=Navigation.findNavController(this, R.id.nav_fragment)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp()
}
}
方式二之动态修改默认起始页
布局文件(不设置navGraph属性):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"/>
</LinearLayout>
activity中动态设置setGraph和setStartDestination:
package com.example.wanandroid.ui
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.Navigation
import com.example.wanandroid.R
class LoginActivity: BaseCompatActivity() {
lateinit var navController: NavController
override fun getLayoutId(): Int {
return R.layout.activity_login
}
override fun initView(savedInstanceState: Bundle?) {
navController=Navigation.findNavController(this, R.id.nav_fragment)
navController.apply {
var mNavGraph=navInflater.inflate(R.navigation.nav_login)
mNavGraph.setStartDestination(when (1) {
1 -> R.id.loginFragment
else -> R.id.registerFragment
})
setGraph(mNavGraph,null)
}
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp()
}
}
起始页fragment点击跳转另一个fragment关键代码

属性说明
| 属性 | 说明 |
|---|---|
| app:defaultNavHost=“true” | 表示拦截系统的返回按钮事件 |
| app:navGraph=“@navigation/nav_login” | NavHostFragment关联的导航图为nav_login.xml |
效果:

传值
activity,fragment间传值-接收
activity中传递:

fragment中接收:

注意:Activity 传参,每个 Fragment 都可获取
fragment间传值-接收
传递:

接收:

本文详细介绍了如何在Android应用中使用Navigation组件来管理Fragment之间的导航。首先,导入了必要的依赖库,然后创建了登录和注册两个Fragment及其布局文件。接着,通过创建导航图nav_login.xml,定义了Fragment之间的跳转路径。最后,展示了如何在Activity中设置NavHostFragment,动态或静态指定起始页面,并实现Fragment间的传值。通过这种方式,可以更方便地管理Android应用的导航流程。
1135

被折叠的 条评论
为什么被折叠?



