目录
- 前言
- 一、导航图元素类型
-
- 1.<navigation>元素
- 2.目的地元素
- 3.<action>元素
- 二、嵌套导航图
-
- 1.使用<navigation>元素
- 2.使用<include>元素
- 3.导航到嵌套导航图
- 三、最终效果和工程代码
-
- 1.最终效果
- 2.工程代码
前言
通过上一章的学习,我们已经对导航组件的使用有了一个基本的了解,现在再来学习如何设计导航图吧。
一、导航图元素类型
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
导航到嵌套导航图
当然还是推荐使用action的方式导航到嵌套导航图,与使用action导航到普通目的地的步骤相同。详见工程代码。
与非嵌套导航图不同,由于我们无法在外部获取嵌套导航图里的目的地的id,所以不能直接从外部导航图导航到嵌套导航图里的目的地。
取而代之的是将嵌套导航图整体作为一个目的地,直接导航到嵌套导航图。然后默认会导航到嵌套导航图的startDestination,后面的具体导航操作由嵌套导航图自己决定。
三、最终效果和工程代码
1.最终效果
2.工程代码
代码地址