当前位置:网站首页>Jetpack Compose之Navigation组件使用
Jetpack Compose之Navigation组件使用
2022-07-23 16:27:00 【my_worldlet】
导入依赖
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间传值-接收
传递:
接收:
边栏推荐
猜你喜欢

一文了解 NebulaGraph 上的 Spark 项目

Use three JS realize the 'ice cream' earth, and let the earth cool for a summer

面试官:你觉得你最大的缺点是什么?

【游戏建模模型制作全流程】3ds Max和ZBrush制作无线电接收器

Simply understand why the first EVM equivalent zkevm polygon is fully betting

悲观锁和乐观锁

【2018】【论文笔记】石墨烯场效应管及【2】——石墨烯的制备、转移

LM393低功耗双电压比较器参数、引脚、应用详解

【重磅】聚焦券商终端业务,博睿数据发布新一代券商终端核心业务体验可观测平台

Where should we start to learn modeling from zero foundation? How to learn game modeling well?
随机推荐
搭建PHP开发环境(Apache+PHP+MySQL)「建议收藏」
Flutter operation mode
As a senior 3D modeler, I give some suggestions to novice learning partners to use
接口测试概述
栈/堆/队列刷题(中)
基于 softether 搭建虚拟私有网络
MySQL classic exercises and answers, 50 common SQL sentence exercises
Tampermonkey究竟有什么用?
如何理解:普通代码块、构造块、静态块?有什么关系?
面试官:你觉得你最大的缺点是什么?
How to capture the analyst rating data of Sina Financial Data Center?
Past weaving of zero one-2022
Prevent and control the summer market blowout after adjustment, and evaluate the summer activities of Tujia, muniao and meituan
【攻防世界WEB】难度三星9分入门题(终):fakebook、favorite_number
【JZOF】13机器人的运动范围
大佬在线复盘:我在训练 DALL·E 时犯过的错
【JZOF】13機器人的運動範圍
kubectl 创建 Pod 背后到底发生了什么?
[whole process of game modeling model production] 3ds Max and ZBrush produce radio receivers
Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)