天天看點

Android Jetpack Navigation元件(二):設計導航圖前言一、導航圖元素類型二、嵌套導航圖三、最終效果和工程代碼

目錄

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

代碼位址