目錄
- 前言
- 一、導航圖元素類型
-
- 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.工程代碼
代碼位址