Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

● 星川 貴樹 (@oboenikui) ● エムスリー株式会社所属 (新卒3年目) ● すき ○ Android ○ プロ野球観戦 ○ ネタTシャツ お ぼ え に く い

Slide 3

Slide 3 text

● 会社で作っている新規アプリにNavigation Componentを導入しま した ● 機能紹介記事は多くありますが、動作に関する解説があまり多くなさ そうだった & 動作を知らないためにモヤモヤしたことがありました ● Navigation Componentがどのように動作しているかを理解したら スッキリ!

Slide 4

Slide 4 text

● Navigation Component が、内部でどのような挙動をしているの か解説します ● 挙動を理解した後に Navigation Component でできることや、 制約について話します

Slide 5

Slide 5 text

● 特に言及されてないところは 2.2.0-rc02 での情報です ● 標準の機能(想定される使い方)として提供されていないという意味 で「できない」という表現を使います ● コードなどはスペースの都合上端折って書いているところがあります

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

● 画面遷移を、決まった原則に従っ て実装するためのライブラリ ● 原則や実装方法などはここ1年で多 くの方が解説してくださっている ので割愛 https://developer.android.com/guide/navigation https://droidkaigi.jp/2019/timetable/70415 https://developer.android.com/guide/navigation /navigation-getting-started より引用

Slide 8

Slide 8 text

● 1つのActivityにおけるFragmentや他Activityへの遷移をXMLで 定義する ● 複雑なFragment遷移を良い感じにコントロールしてくれる ● Navigation要素 (ToolbarやBottomNavigationなど) と連携 して良い感じの遷移を簡単に記述できる

Slide 9

Slide 9 text

● なぜpopUpToオプションに のIDを指定する場合が ある? ● Fragmentをキャッシュできないの? ● マルチモジュール構成のプロジェクトでのベストプラクティスは? ● …… 仕組みを先に理解しないとモヤモヤが残る

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

● XMLで定義したグラフ(木構造) ● が内部ノード, が葉ノードになる ○ これらのノードをNavDestinationと呼ぶ ● は別扱い

Slide 12

Slide 12 text

● NavController#navigate メソッドでdestinationとして指定 できるもの ○ ただし は別物 ● を持つことが可能 ○ これらはNavDestinationのプロパティみたいなもの ○ に関しては では使えない

Slide 13

Slide 13 text

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Actionは遷移時のオプションをまと めたショートカットみたいなもの Actionを使わずに遷移もできるがこ こでは説明の簡略化のため割愛する

Slide 16

Slide 16 text

【見かけの挙動】 へのactionでは Start Destinationへ更に遷移する ここでは見かけ上 → という遷移

Slide 17

Slide 17 text

【本質的な話】 は親ノードである の子ノードだったら 遷移可能。そのため → の遷移が可能 親の子ノード 親の子ノード ではない者達 親

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

【見かけの挙動】 から への遷移

Slide 20

Slide 20 text

親の子ノード 親の子ノードではない者達 親の子ノード ではない者達 親 【本質的な話】 は親の親ノードであ る の子ノードだっ たら遷移可能。そのため → の遷移が可能

Slide 21

Slide 21 text

親の親の 子ノード 親 親の親 【本質的な話】 は親の親ノードであ る の子ノードだっ たら遷移可能。そのため → の遷移が可能 親や親の親の子ノードではない者達 親の子ノード

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

親 親の子ノード ではない者達 親の子ノード 【本質的な話】 先祖ノードから辿れないノードへは Actionでは直接遷移できない

Slide 24

Slide 24 text

親が知らない 行き先

Slide 25

Slide 25 text

親が知らない 行き先 Deep Linkは遷移可能なノードを ルートから全探索するので理論上 どこへも遷移できる ルート 誰かこのDeep Link扱えない?

Slide 26

Slide 26 text

親が知らない 行き先 Deep Linkは遷移可能なノードを ルートから全探索するので理論上 どこへも遷移できる ルート 誰かこのDeep Link扱えない? 無理 無理 わからん、聞いてみる わからん、聞いてみる

Slide 27

Slide 27 text

親が知らない 行き先 Deep Linkは遷移可能なノードを ルートから全探索するので理論上 どこへも遷移できる ルート 誰かこのDeep Link扱えない? 無理 無理 無理 できるよ 誰かこのDeep Link扱えない?

Slide 28

Slide 28 text

● XMLをパースしてNavGraphを構築したり、実際の遷移処理を行うク ラス ● NavControllerはFragmentManagerとは別に、遷移した NavDestinationをBack stackとして保持する

Slide 29

Slide 29 text

NavControllerの Back stackのイメージ

Slide 30

Slide 30 text

タグも スタックに積まれる

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

Activity遷移は管理する必要 がないのでstackに積まない

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

積み残ったも 同時に整理される

Slide 46

Slide 46 text

● popUpToで指定したdestinationがBack stackに積まれていた場 合は、そこまでpopする機能 ● popUpToInclusive = true ならそのdestinationもpopする popUpToInclusive = false ならその手前までpopする

Slide 47

Slide 47 text

popUpTo に を設定した場合 ここまでの stackを popする

Slide 48

Slide 48 text

popUpTo に を設定した場合

Slide 49

Slide 49 text

popUpTo に を設定した場合

Slide 50

Slide 50 text

popUpTo に を設定した場合 popUpTo にルートの を指定 するのは、Back stackをクリアするのと同義

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

● 直下に を設定すると、どの子孫ノードからも 実行できるActionが作られる よく解説ブログに出てくる Action

Slide 53

Slide 53 text

● 直下に を設定すると、どの子孫ノードからも 実行できるActionが作られる Global Action

Slide 54

Slide 54 text

Google I/Oでの発表によると、 ● 各モジュールごとにNavigation XML を作る ● メインモジュールのNavigation XML でincludeする のが想定解の模様 https://youtu.be/JFGq0asqSuA?t=1130

Slide 55

Slide 55 text

Google I/Oでの発表によると、 ● 各モジュールごとにNavigation XML を作る ● メインモジュールのNavigation XML でincludeする のが想定解の模様 https://youtu.be/JFGq0asqSuA?t=1130 ...

Slide 56

Slide 56 text

...

Slide 57

Slide 57 text

...

Slide 58

Slide 58 text

● 2.3.0から?使えるようになるみたいです ● 現在SNAPSHOT版が公開されてます https://developer.android.com/guide/navigation/navigation-dynamic

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

● 例えば右のようなアプリで と遷移した後、バックボタンを押したらどう遷移 するのが理想か ● Navigationではスタック操作で可能な遷移のみ 実現できるので以下のような遷移ができない

Slide 61

Slide 61 text

● BottomNavigationView などのナビゲーション用Viewで遷移する 場合、Fragmentが新たに生成される ○ Google Newsアプリが近い挙動 ● popBackStack しない限り生成済みのFragmentには戻らない、と いう挙動が徹底されている ● ViewModelに表示に関する全てのデータを持たせ、Fragmentはそ れに従って表示するだけ、というのを徹底する思想?

Slide 62

Slide 62 text

SafeArgs Pluginの問題だが、includeしたNavigation XML内で定 義された を読んでくれない

Slide 63

Slide 63 text

Slide 64

Slide 64 text

// 理想: Stringを引数に取るメソッドが生成されてほしい MainNavigationDirections.actionMainToSub("hoge")

Slide 65

Slide 65 text

// 理想: Stringを引数に取るメソッドが生成されてほしい MainNavigationDirections.actionMainToSub("hoge") // 現実: 引数を何も取らないメソッドが生成される MainNavigationDirections.actionMainToSub()

Slide 66

Slide 66 text

Slide 67

Slide 67 text

navigation-safe-args-generatorに実装があるので最新の実装は こちらから確認できます https://android.googlesource.com/platform/frameworks/support/+/androidx-m aster-dev/navigation/navigation-safe-args-generator/

Slide 68

Slide 68 text

● Navigation Component の動作について解説をした ● Navigation Component の中の事情を知った上で、 何ができるか/できないかについて解説した ● Android Advent Calendar にも関連記事を書く予定 ● 実験用に作ったサンプルリポジトリはこちら (最新版をpushし忘れたので後で確認してください^^;) https://github.com/oboenikui/navigation-experiment

Slide 69

Slide 69 text

Slide 70

Slide 70 text

Slide 71

Slide 71 text

Slide 72

Slide 72 text

Slide 73

Slide 73 text