どもどもども〜。Google I/O 2018盛り上がっていますね(お家Extended勢)
Day1のセッションやキーノートをいくつか見ていてDeveloper Keynoteに登場していた(確か)Xcodeのストーリーボードみたいな見た目をしていたNavigationが凄く気になったのでとりあえず軽く触ってみたので軽い説明と感想を書いてみる。
注意点として、現状Android Studioの3.2のCanary 14からしか使えない(現状最新)のでアップデートしてから試してください)。
Google I/O 2018で発表されたてほやほやのアプリ内でのNavigationを簡単に実装できるコンポーネント。
The Navigation Architecture Component | Android Developers
最初Developer Keynoteで見たときはそういう意識では見ていなくて「おっ!ストーリーボードみたいなやつくるやんけw」って思ってとりあえずさっと見て触ってみた。
Implement navigation with the Navigation Architecture Component | Android Developers
基本的にはこれに従ってやっていくと簡単に実装ができる。
1点、コンポーネント類をプロジェクトに導入する際にAdding Components to your Project | Android Developersを参考にbuild.gradle
を記述するが、AndroidX version of Navigation will be released in the future.
とあるようにNavigation関連のandroidx.*
はまだ存在しないらしい。
のにもかかわらず、Safe argsで
1 2 3 4 5 6 7 8 | buildscript { repositories { google() } dependencies { classpath "androidx.navigation:safe-args-gradle-plugin:1.0.0-alpha01" } } |
と書いてあるがこれは今の段階では解決できない。
今の段階ではArchitecture Componentには存在するらしいのでclasspathをandroid.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01
で使ってあげるとapplyすることができた。
上記のガイドをかいつまんで簡単に紹介すると
res
ディレクトリを右クリックしてNew > Android resource file
してNew resource
をするnav_graph
)、Resource TypeをNavigation
にするnav_graph.xml
でFragmentと遷移のActionなどを定義してあげる<fragment>
タグを作りapp:navGraph="@navigation/nav_graph"
を入れてあげるNavigation.createNavigateOnClickListener(R.id.hoge_action)
をあてるnav_graph
で定義した遷移になる簡単でしょ。 サンプルアプリのソースもホントに軽いので多分サラッと読んでここに戻ってくると一瞬で理解できると思う(理解したとは言ってない)
今までActivityからFragmentを入れたり、FragmentからFragmentに遷移するときはtransaction
したりcommit
したりとおまじないのようなコードをめちゃくちゃいっぱい書いていたと思うが、それらがない。
Fragmentを使って遷移しているはずなのに、Activity/Fragment側のコードが簡潔になる。
今回作ったサンプルアプリでは1Activityアプリで、そこでFragmentの遷移を行っているが、setContentView()
しか行っていない。
Android-Navigation-Sample/MainActivity.kt at master · yagi2/Android-Navigation-Sample
サンプルアプリでは、MainFragment -> 遷移1 -> 遷移2 -> 遷移3 -> MainFragmentに戻る
という遷移を実装している。
実際のクラスとしてはMainFragment
とFlowFragment
の2つだけが存在し、FlowFragment
へ何番目のFragmentなのかを引数として渡している。
Android-Navigation-Sample/MainFragment.kt at master · yagi2/Android-Navigation-Sample
引数を定義しているのはnav_graph.xml
で以下のような感じで遷移と同時に引数を定義している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ... <fragment android:id="@+id/fragment_main" android:name="com.yagi2.navigationsample.MainFragment" android:label="MainFragment" tools:layout="@layout/fragment_main" > <action android:id="@+id/action_main_to_flow_one" app:destination="@id/fragment_one" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slise_in_left" app:popExitAnim="@anim/slide_out_right" /> </fragment> <fragment android:id="@+id/fragment_one" android:name="com.yagi2.navigationsample.FlowFragment" android:label="fragment_one" tools:layout="@layout/fragment_one" > <argument android:name="number" android:defaultValue="1" app:type="integer" /> <action android:id="@+id/action_next_flow" app:destination="@id/fragment_two" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slise_in_left" app:popExitAnim="@anim/slide_out_right" /> </fragment> ... |
これはMainFragment
から次の1つ目のFragmentに遷移する部分の抜粋で、@id/fragment_main
の中に<action>
タグで遷移を書く。
app:destination
で行き先のFragment(これはクラスではなくてNavigationでの<fragment>
のこと)を指定する。
@id/fragment_one
ではargumentを定義してあって、defaultValueを1で定義している。そして次のFragmentに遷移するactionを記述している。
ここで定義した引数はFragmentから普通に取得することができ、Android-Navigation-Sample/FlowFragment.kt at master · yagi2/Android-Navigation-Sampleのようなクラス実装になっている。
ふんわりしか触っていないのでまだあまり理解してない上に知らない機能(Nested GraphもあるっぽいしActivityもNavigationに置けるのでどう使えば良いか……)があるのでちょくちょく触りたい。
個人的にFragmentの管理がソースコードからだと結構わかりにくくなってしまう上に、プロジェクト引き継ぎ等の際に読み解くのが結構困難なのでかなり便利なのではないかという感想。
今の所触った感じでいうと、1Activityの中のFragmentの遷移を1Navigation Graphファイルに書いてあげて、それをActivityのレイアウトで指定してあげると良さそう。
Google I/Oを見ている感じむやみにActivityを作らずにせよみたいな雰囲気だったのでこういうツールとコンポーネントで後押ししている感じがした。
マジでストーリーボードみたいなエディターめちゃくちゃ見やすいので神。
使える機会があったら積極的に使っていくのが良さそう。(たぶん)
(間違いとか新しいのを見つけたときは追記や訂正します)
<< キャッシュレス生活2018 in 京都 DroidKaigi 2018に参加してきた >>
2018やぎ小屋