瞧瞧 Android Navigation Component

Hank Li
5 min readSep 4, 2019
雲林 西螺大橋

新選擇 Android Navigation Component

除了使用傳統的 FragmentManager 來管理 Fragment 之外,官方提供另一套新的管理做選擇,那就是 Android Navigation Component ,讓我們來瞧瞧~

使用 FragmentManager 做管理最常見的問題就是

  1. 不容易知道完整 App 流程
  2. 自行控制 Back Stack
  3. UI 狀態管理(Options Menu, Up Button 是否顯示、Bottom Navigation 是否在正確的位置 Highlights 等…)

這些問題 Android Navigation Component 通通幫你處理~

使用 Navigation Component 的好處

三個主要元件

Navigation graph

新的 XML Resource,中心化管理 App 中所有導航相關資訊,另外介紹 Destination, Action 兩個名詞,Destination (目的地) 也就是 Fragment 或 Activity,Action 是 Destination 前往另一個 Destination 的路徑

Navigation graph

NavHostFragment

Layout XML View,用來顯示 Navigation graph 中的 Destination 的容器

範例:在 XML 中輸入 <fragment>,name 指定為 NavHostFragment 即可

NavHostFragment
效果圖

NavController

Kotlin/Java object,管理、追蹤 Navigation graph 的 Destination 正確顯示在 NavHostFragment 裡

使用 NavController 做導航

實戰演練

Google Codelabs 有提供完整的練習教學 (Kotlin),大家一定要去看~

下面分享我學習到的幾個重點

轉場

指定 Destination 透過 NavController 來轉場或者使用靜態方法轉場

指定 Destination 透過 NavController 來轉場 (setOnClickListener 後面是大括號)
指定 Destination 透過使用靜態方法轉場 (setOnClickListener 後面是小括號)

單純轉場感覺乏味嗎?加點動畫~

透過 NavOption 設定轉場動畫

當然我們也能透過 Action 進行轉場,先在 Navigation graph 裡先設定好 Action

設定 action (目的地、動畫…)

一樣指定 Action 透過 NavController 來轉場或者使用靜態方法轉場

指定 Action 透過使用靜態方法轉場 (setOnClickListener 後面是小括號)

Fragment 傳參數

如果我們想傳參數給 Fragment 怎麼辦? 你可以使用傳統的 Bundle 傳參數或使用 Navigation Component 提供 SafeArgs plugin 來傳參數

使用 SafeArgs Plugin 必須先設定 Gradle,在 Project 的 build.gradle 的 dependencies 裡加入

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion"

再來在 App 的 build.gradle 加入

apply plugin: 'androidx.navigation.safeargs.kotlin'

使用 SafeArgs 也是一樣要先去 Navigation graph 設定

設定 argument

build project 後 gradle 會自動產生 Class

gradle 自動產生 Class

這時就能在目的地的 Fragment 中使用 Gradle 產生的 Class 取參數

從別的 Destination 傳參數並轉場另一個 Destination

結語

Navigation Component 的好處不只這些,快去 Google Codelabs 練習,你會發現更多厲害的功能~

如有任何問題或批評指教,歡迎您留言告訴我!
請各位給我點掌聲!謝謝各位的觀賞.

--

--