Android Jetpack Navigation组件(二):设计导航图

前言

通过上一章的学习,我们已经对导航组件的使用有了一个基本的了解,现在再来学习如何设计导航图吧。

一、导航图元素类型

1.<navigation>元素

<navigation>元素表示一个导航图,它是导航图的根元素,可以嵌套使用。

2.目的地元素

  • <fragment>

    <fragment>元素表示目的地是一个Fragment,是我们主要使用的目的地类型

  • <dialog>

    <dialog>元素表示目的地是一个DialogFragment,可以用它展示一个对话框

  • <activity>

    <activity>元素表示目的地是一个Activity,在单Activity架构模式下不会使用

3.<action>元素

  • 局部action

在目的地元素里面声明的action是局部action。例如:

<fragment
        android:id="@+id/aFragment"
        android:name="com.scx.navigation.designnavgraph.AFragment"
        android:label="aFragment" >
        <action
            android:id="@+id/action_aFragment_to_bFragment"
            app:destination="@id/bFragment" />
</fragment>

局部action只能由其所在目的地使用。
比如上述的action只能在AFragment里面使用,通过AFragmentDirections(格式为:目的地类名+Directions)获取该action。

  • 全局action

在<navigation>元素里面声明的action是全局action。例如:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/aFragment">	
	<fragment>
	......
	</fragment>
	<action
            android:id="@+id/action_global_tipDialogFragment"
            app:destination="@id/tipDialogFragment" />
</navigation>

全局action可以由导航图里的所有目的地使用。
  在目的地里获取全局action的方式与获取局部action的方式相同。
  在目的地外(比如Activity)通过NavGraphDirections(格式为:导航图id的驼峰式表示+Directions)去获取全局action。

那么什么时候用全局action?
  多路径可达的目的地使用全局action。
  假设A和B都需要导航到D,那么导航到D目的地的action应该为全局action。好处是既能避免重复声明action,又能清晰化导航图逻辑。

二、嵌套导航图

1.使用<navigation>元素

这样写的优点是直观,缺点是较为臃肿。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    app:startDestination="@id/aFragment">
    ......
    <navigation android:id="@+id/nav_graph_nested" 
    	app:startDestination="@id/cFragment">
    	<fragment
        	android:id="@+id/cFragment"
        	android:name="com.scx.navigation.designnavgraph.CFragment"
        	android:label="CFragment" />
    </navigation>
</navigation>

2.使用<include>元素

使用<include>元素可以依赖外部导航图。类似于layout的<include>元素。
方便起见,下面代码中的导航图nav_graph_nested.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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/aFragment">
	......
    <include app:graph="@navigation/nav_graph_nested" />
</navigation>

优点:

  • 简洁
  • 具有复用性
  • 方便模块化

基于以上优点,建议采用<include>元素实现导航图的嵌套

3.导航到嵌套导航图

使用嵌套导航图的id导航到嵌套导航图

navController.navigate(R.id.nav_graph_nested);

当然还是推荐使用action的方式导航到嵌套导航图,与使用action导航到普通目的地的步骤相同。详见工程代码。

与非嵌套导航图不同,由于我们无法在外部获取嵌套导航图里的目的地的id,所以不能直接从外部导航图导航到嵌套导航图里的目的地。
取而代之的是将嵌套导航图整体作为一个目的地,直接导航到嵌套导航图。然后默认会导航到嵌套导航图的startDestination,后面的具体导航操作由嵌套导航图自己决定。

三、最终效果和工程代码

1.最终效果

2.工程代码

代码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值