Navigation 是 Android Jetpack 中的一个组件,旨在简化 Android 应用程序中的导航和屏幕间的交互。它提供了一种简单而强大的方式来管理应用程序中的导航,包括屏幕之间的导航、深链接和动画等。以下是关于 Navigation 组件的详细介绍和用法:
一、设置导航图
在 res/navigation
目录下创建导航图 XML 文件(navigation.xml),并在其中定义应用程序的所有目的地和连接它们的操作。NavGraph(导航图): 导航图是一个 XML 文件,它定义了应用程序中的所有目的地和导航路径。每个目的地都代表应用程序中的一个屏幕或操作,例如一个片段、活动或其他导航目标。导航图由目的地和连接它们的操作组成。一般使用一个homeFragment内嵌在navigation
作导航图。
将homeFragment作为起始点(一般一个导航图必须内嵌一个Fragment)
二、配置导航宿主
1.NavHost(导航宿主): 导航宿主是一个容器视图,用于在应用程序的 UI 中显示导航图中的目的地。在 XML 布局中,通常使用 NavHostFragment
或 NavHostView
来定义导航宿主。
在 XML 布局文件中添加 NavHostFragment
或 NavHostView
作为容器来显示导航图中的目的地。回到activity_main.xml将刚才设置的navigation成为NavHostFragment
作为容器来显示导航图中的目的地。
2.设置导航图,点击该导航图的按钮将会跳转到另一个Fragment
结合Data Binding使用: Navigation 组件与 Data Binding 结合使用,可以简化目的地的布局文件,并在 XML 中执行导航操作
class HomeFragment : Fragment() {
private val mBinding: FragmentHomeBinding by lazy{
FragmentHomeBinding.inflate(layoutInflater)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return mBinding.root
}
}
3. 设置另一个跳转Fragment页面(DownloadFragment)
三、执行导航操作
1.将导航图与Download页面设置导航
2.设置监听事件
package com.example.applicationflow.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.example.applicationflow.R
import com.example.applicationflow.databinding.ActivityMainBinding
import com.example.applicationflow.databinding.FragmentHomeBinding
class HomeFragment : Fragment() {
private val mBinding: FragmentHomeBinding by lazy{
FragmentHomeBinding.inflate(layoutInflater)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return mBinding.root
}
//设置点击事件,点击导航图的按钮将跳转到Download下载页面
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mBinding.btnFlowAndDownload.setOnClickListener{
findNavController().navigate(R.id.action_homeFragment2_to_downloadFragment2)
}
}
}
四、测试结果
跳转