## Jetpack-Navigation(kotlin)(一)
学习笔记,案例来自于:
https://www.bilibili.com/video/BV1w4411t7UQ/?p=17
一、基本概念---该部分直接引用谷歌官网介绍
1.基本组成
- 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
-
NavHost
:显示导航图中目标的空白容器。导航组件包含一个默认NavHost
实现 (NavHostFragment
),可显示 Fragment 目标。 -
NavController
:在NavHost
中管理应用导航的对象。当用户在整个应用中移动时,NavController
会安排NavHost
中目标内容的交换。
在应用中导航时,您告诉 NavController
,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController
便会在 NavHost
中显示相应目标。
2.优势
- 处理 Fragment 事务。
- 默认情况下,正确处理往返操作。
- 为动画和转换提供标准化资源。
- 实现和处理深层链接。
- 包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
- Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
-
ViewModel
支持 - 您可以将ViewModel
的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。 - 使用 Android Studio 的 Navigation Editor 来查看和编辑导航图。
注意:需要 Android Studio 3.3 或更高版本。
3.具体使用案例
1.新建两个fragment
2.新建一个navigation资源文件,并且打开切换至“design"视图
4.通过可视化设置导航
设置navigation资源文件
设置activity_main:添加NavHostFragment控件,设置其属性navGraph=你的navigation资源文件
<?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"
xmlns:tools="http://schemas.android.com/tools"
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_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/navigation_main" />
</androidx.constraintlayout.widget.ConstraintLayout>
5.代码编写
MainActivity
package com.example.navigationdemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.ui.NavigationUI
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//注意:该布局文件id---是NavHostFragment的id
val navController:NavController=Navigation.findNavController(this,R.id.fragment)
//显示左上角返回键
NavigationUI.setupActionBarWithNavController(this,navController)
}
//设置左上角返回键的点击
override fun onSupportNavigateUp(): Boolean {
return Navigation.findNavController(this,R.id.fragment)
.navigateUp()
}
}
DetailFragment
package com.example.navigationdemo
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_detail.*
/**
* A simple [Fragment] subclass.
* Use the [DetailFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class DetailFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_detail, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//按键点击事件
button2.setOnClickListener(View.OnClickListener {
Navigation.findNavController(it)
.navigate(R.id.action_detailFragment_to_homeFragment) //该id是Android studio 生成的无需手动
})
}
}