Android Jetpack | Navigation

文章目录

(一)Navigation graph(导航图)——所有关系图

(二)NavHost (容器)——显示某个Fragment

(三)NavController——如何切换

3.1 An object(对象) that manages app navigation within a NavHost .

3.2 Views

(四) Safe args 

4.1 简介

4.2 使用方法 

4.2.1 简单尝试——传递integer 

0)启用前准备,定义目的地参数(argument)

1)启用Safe Args(添加插件)

2) 传递参数(argument)

4.2.2 传递 类(封装好的数据类)


        采用 Navigation 组件优化了用户界面间的导航管理,替代了原先繁琐的 Fragment 事务处理,实现了直观的导航流,增强了代码的维护性。

            Android developers | navigation 

(一)Navigation graph(导航图)——所有关系图

    An XML resource that contains all navigation-related information in one centralizedlocation(集中位置)。

This includes all the individual content areas(单独内容区域 within your app, called destinations(目的地, as well as the possible paths(路径) that a user can take through your app.


(二)NavHost (容器)——显示某个Fragment

    An empty container that displays destinations(显示目的地) from your navigation graph.

The Navigation component contains a default NavHost implementation(实现),NavHostFragment , that displays fragment destinations.

        Navigation组件包含NavHostFragment(一个默认的NavHost实现),用于显示片段目的地。

NavHost 是一个抽象类,它的实现类是 NavHostFragment。


(三)NavController——如何切换

 每个NavHost都有自己相应的NavController

3.1 An object(对象) that manages app navigation within a NavHost .

The Navcontroller orchestrates(编排) the swapping of destination content in the NavHost as users move throughout your app.

3.2 Views

        If you are using the Views UI framework, you can retrieve your NavController using one of the following methods depending on the context(如果您使用的是View UI框架,您可以根据上下文使用以下方法之一检索您的NavController :):
Kotlin:

Fragment.findNavController()  //在Fragment中
View.findNavController()      //知道了一个view
Activity.findNavController(viewId: Int)  //在Activity中

Java: 

NavHostFragment.findNavController(Fragment)
Navigation.findNavController(Activity, @IdRes int viewId)
Navigation.findNavController(View)

警告: 在onCreate()中检索NavController,Activity.findNavController(viewId: Int) 或 Navigation.findNavController(Activity, @IdRes int)

失败原因:

  • 使用FragmentContainerView创建NavHostFragment(我前面用的)
  • 在活动中手动添加NavHostFragment时

正确方式:直接从NavHostFragment中检索NavController(上面示例)  

★通常,(理解:导航图是教室座位表,Fragment是学生)

  1. 获得NavHost Fragment(班级),
  2. 从片段中检索NavController(班主任)
val navHostFragment =
    supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

(四) Safe args 

4.1 简介

参考文章

        当在应用中导航到不同目的地的时候,可能会需要传递数据。为了避免使用全局对象引用,通过数据传递可以实现更好的代码封装结构,这样不同的 fragment 或者 activity 仅需要分享它们所需的数据即可。

    Bundles机制:为要传递的数据创建一个 Bundle,然后在接收侧将数据提取出来。

  • 导航组件传递数据,
  • Android 中跨 activity 传递数据。

不过导航组件有更好的方法:SafeArgs

SafeArgs gradle 插件,在不同的目的地 (界面) 之间提供更加便捷的数据传递功能。

优点

  • 代码更简洁
  • 为数据增加了类型安全的保障,使得代码具备更好的健壮性。

4.2 使用方法 

4.2.1 简单尝试——传递integer 
0)启用前准备,定义目的地参数(argument)

        在导航图中,点击接收参数的目的地,找到 Attributes(属性) 面板

 以Welcome->Home为例
1)启用Safe Args(添加插件)

因为官网还没更新(如下图),AS中没有buildscript,因此需要对官网步骤略作更改

2) 传递参数(argument)

传入方(WelcomeFragment)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //点击"Welcome"后,切换到"Guide"页面
        binding.textView1.setOnClickListener {
            //设置参数并传递给navigation
            val action = WelcomeFragmentDirections.actionWelcomeFragmentToHomeFragment().setHomeArg(20)
            findNavController().navigate(action)
        }
    }

接收方(HomeFragment):

//接收方:获取传过来的参数对象
    private val args:HomeFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
//取值
        binding.textView3.text = args.whArg.toString()
        binding.textView3.setOnClickListener {
            findNavController().navigate(R.id.action_homeFragment_to_drawFragment3)
        }
    }

}

       

4.2.2 传递 类(封装好的数据类)
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    //SafeArgs
    id("androidx.navigation.safeargs")
//添加插件
    id("kotlin-parcelize")
}

User类 

package com.example.littlepainter

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class User constructor(val name:String,val age:Int):Parcelable

传入方:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //点击"Welcome"后,切换到"Guide"页面
        binding.textView1.setOnClickListener {
            //传入方:设置参数并传递给navigation
            val action =
                WelcomeFragmentDirections.actionWelcomeFragmentToHomeFragment(20,User("guo",19))
            findNavController().navigate(action)
        }
    }

接收方:

 //取值
        binding.textView3.text = args.user.name

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值