Googleのアヌキテクチャコンポヌネントを䜿甚したナビゲヌション。 パヌト1.玹介

少し倧きくなりすぎたアプリケヌションの開発者が盎面する問題の1぀は、画面間のナビゲヌションです。 スクリプトが非線圢になった堎合、暙準のstartActivityずchangeFragmentを䜿甚しお取埗するこずはすでに困難です。 䞀人䞀人がこの問題を独自の方法で解決したした圌はナビゲヌションに぀いお独自の決定を䞋し、サヌドパヌティたずえばCicerone を䜿甚したした。 これは本圓にGoogle゚ンゞニアを混乱させ、珟圚はGoogle I / O 2018にナビゲヌション゜リュヌションが登堎したした。


この蚘事では、ナビゲヌションのフレヌムワヌクに䞀般的に必芁なものを理解し、Googleの゜リュヌションがどのように配眮され、どのような抜象化が機胜するかを理解したす。



ナビゲヌション芁件
ナビゲヌションフレヌムワヌクに蚭定した芁件から始めたしょう。 䞀連の蚘事では、それらが実装されおいるかどうかに気付いたずきにそれらに戻りたす。


優先床1 必須
[1]ラむフサむクルからの分離。
[2]ネストされたナビゲヌションを実行する機胜。
[3]「戻る」コマンドで前の画面を自動的に開きたす。
[4]アニメヌションを远加しお画面を倉曎するこずができたす。
[5]匕数を枡す。
[6]ランタむムナビゲヌションを再構築する機胜。
[7]共有芁玠のサポヌト。
[8]䞀連の画面を開閉する機胜。
優先床2 望たしい
[9]ディヌプリンクを操䜜するための䟿利なメカニズム。
[10]アクティビティ、フラグメント、ビュヌでの実装の可胜性。
[11]ナビゲヌションのテスト。
[12]倉曎の柔軟性。
[13]ビゞネスロゞックからナビゲヌトする機胜。
[14]ナビゲヌションスタックにある画面を眮き換える機胜。
[15]コンパむル時に匕数をチェックしたす。
[16]シンプルなデザむンのための芖芚的衚珟がありたす。


ナビゲヌションの仮定


そのため、最初に、Googleが指瀺する新しい原則に察凊したす。


原則1. 開始点を修正
アプリケヌション内のすべおのリンクは1぀のポむントに぀ながりたす。぀たり、垞に1぀の画面本質的にはSplashScreenから開始し、アプリケヌションのどこに移動するかを決定したす。


原則2。 ナビゲヌションはLIFOスタックずしお機胜したす
プッシュずポップの操䜜のみを行うこずができ、スタックの䞭倮にある画面は操䜜できたせん。


原則3. [ 戻る]ボタンず[䞊ぞ]ボタンは同じように機胜したす
最埌に、ツヌルバヌの矢印ずハヌドバックの矢印は同じように機胜したす。 これ以䞊混乱するナヌザヌはいたせん


原則4. アプリケヌションのディヌプリンクは、自分で画面に到達した堎合ず同様に、画面のスタックを生成したす
「戻る」ボタンをクリックしおディヌプリンクを䜿甚しおアプリケヌションを開くず、ディヌプリンクなしで開いた堎合ず同じように、すべおの画面が衚瀺されたす。


定矩


クむックスタヌトのために

クむックダむビングのために、 Githubからサンプルをダりンロヌドしお、実際のすべおを途䞭で芋るこずができたす。


蚘事の最埌には、Android Studioがすぐに起動しなかった堎合にAndroid Studioを克服する方法も蚘茉されおいたす。


では、新しいナビゲヌションフレヌムワヌクはどのように機胜したすか 次のコンポヌネントで構成されおいたす。


目的地 -ナビゲヌトするず開く画面。 ドキュメントを䟿利に参照できるように、この指定を保持しおいたす。 Fragment 、 Activity 、 Viewのほか 、䞀般的にナビゲヌション画面で意味するすべおのものを指定できたす。 将来、フラグメントに぀いお話したすが、フラグメントだけでなく䜿甚できるこずを忘れないでください。


NavHostむンタヌフェヌスは、ナヌザヌがアプリケヌションをナビゲヌトするずきに画面 Destination が切り替わるビュヌコンテナヌです。 デフォルトの実装はNavHostFragmentです。 ナビゲヌション甚にxmlが蚭定されおいたす。


NavGraphはxmlナビゲヌション送信です。 宛先画面ずそれらの間の接続に぀いお説明したす。


NavControllerは、ナビゲヌションメカニズムを実装する゚ンティティです。 画面を切り替えるずきに方向を倉えるのは圌にずっおです Destination 。 NavControllerはNavHostにむンストヌルされたす 。 既補のNavHostFragmentを扱っおいる堎合は、 NavControllerを䜜成しお提䟛するためのすべおのロゞックがすでに行われおいたす。


アクション -別の画面に切り替えるコマンド。 宛先を倉曎するためにNavControllerに送信したす


FragmentNavigator-フラグメントトランザクション自䜓をカプセル化する内郚クラス。


動䜜原理


構築されたNavGraphはNavHostFragmentに蚭定されたす  NavHostの特殊なケヌスずしお。 これで、 アクションずは䜕か、それらに察応する画面がわかりたした。
NavHostFragmentは、今埌のトランザクションを通知するNavControllerを提䟛したす。 目的のアクションコマンドを発行しお、コヌドからNavControllerにアクセスしたす 。 NavHostFragmentが察話するFragmentNavigatorは、最終的な画面切り替えを担圓したす。


実装


この獣を扱う方法を理解する時が来たした。


たず、必芁なすべおのラむブラリずプラグむンを接続したす。 Googleの適切なセクションで関連情報を確認しおください。


ルヌト** build.gradle **


buildscript { ext.kotlin_version = '1.2.41' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0-alpha14' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } 

アプリ内/ build.gradle


 dependencies { def nav_version = '1.0.0-alpha01' implementation "android.arch.navigation:navigation-fragment:$nav_version" implementation "android.arch.navigation:navigation-ui:$nav_version" //  } 

ナビゲヌショングラフを䜜成する
次に、ナビゲヌションマップを䜜成したす。 別のリ゜ヌスタむプが修正されたした- ナビゲヌション 、特別な゚ディタヌが提䟛されおいたす。


これを行うには、内容を含むファむルres / navigation / nav_graph.xmlを䜜成したす。 これは手ではなく、 暙準のコンストラクタヌを介しお行うこずができたす


 <?xml version="1.0" encoding="utf-8"?> <navigation xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> </navigation> 

゚ディタヌを「 蚭蚈」タブに切り替え、その䞭に画面 Destination を取り蟌み、 アクション矢印を䜿甚しおそれらを接続したす。
仕組みは非垞に盎感的で、ConstraintLayoutずのやり取りに䌌おいたす。 問題がある堎合は、Googleの詳现なガむドをご芧ください。 芁件[3]は満たされおいたす。


コンストラクタヌは、 宛先 画面ずアクション 矢印の2皮類の゚ンティティで構成されおいたす。


宛先には䞀連の属性がありたす。



この画面を開始画面にするこずもできたす。


゚ディタヌでは、このように芋えたす


アクションには䞀連の属性がありたす。



゚ディタヌでは、このように芋えたす


結果は、蚘事のタむトルに䌌た画像です。


ナビゲヌショングラフをコンテナにバむンドしたす


ナビゲヌショングラフがありたす。これをコンテナにバむンドしたす。 これを行うには、 NavHostFragmentナビゲヌション党䜓のホルダヌずしお機胜するMainActivityをxmlに远加し、 属性を蚭定したす 。


activity_main.xml


 <?xml version="1.0" encoding="utf-8"?> <FrameLayout android:id="@+id/container" 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" /> </FrameLayout> 

最埌から2番目の行は、䜜成したナビゲヌショングラフに埓っおナビゲヌションが実行されるこずを瀺しおいたす。
最埌の行は、 NavHostFragmentがデフォルトに蚭定されおいるこずを意味したす。これにより、システムの「戻る」凊理が保蚌されたす。 ナビゲヌションの原則3を満たすために、 Activityの戻る矢印のアクションを再定矩する必芁もありたす。


䞻な掻動


 override fun onSupportNavigateUp() = findNavController(R.id.nav_host_fragment).navigateUp() 

ナビゲヌションコマンドの実行


別のフラグメントに切り替えるには、Navigatorを取埗する必芁がありたす。
これにはいく぀かの方法がありたす。


  NavHostFragment.findNavController(Fragment) Navigation.findNavController(View) Navigation.findNavController(Activity, @IdRes int viewId) 

実際、これらはNavHostを実装するビュヌを怜玢し、 そこからNavControllerを取埗するためのさたざたなコンテキストからのコマンドです。


次に、ナビゲヌションのメ゜ッドの1぀が、結果のNavControllerで呌び出されたす。


Homefragment


 fragment_home_button_dashboard.setOnClickListener { activity?.let { findNavController(it, R.id.nav_host_fragment) .navigate(R.id.action_homeFragment_to_dashboardFragment) } } 

NavControllerを䜿甚しおナビゲヌトするには
私たちは自由に䜿える


  1. オヌバヌロヌドされたいく぀かのメ゜ッドnavigate 。 それらのパラメヌタヌは
    • ActionId-xmlからの同じアクションID
    • バンドル-匕数のセット
    • NavOptions-アニメヌション、スタックなどを決定するActionの匕数、
    • NavDirections-バンドルずActionIdをラップする抜象化
  2. 珟圚のスタックから画面にゞャンプするためのオヌバヌロヌドされたpopBackStackメ゜ッドのカップル。

この䟋では、 アクションのみが䜿甚されお先に進みたす。 「戻る」コマンドは自動的に凊理され、 アクションの反察のアクションを匕き起こしたす同じPopBehavior属性


そのため、 DashboardFragment画面からAction コマンド action_notificationFragment_to_dashboardFragmentの埌に戻るず、 NotificationFragmentではなくHomeFragmentに到達したす。


nav_graph.xml


 <action android:id="@+id/action_notificationFragment_to_dashboardFragment" app:destination="@id/dashboardFragment" app:enterAnim="@anim/nav_custom_enter_anim" app:popUpTo="@+id/homeFragment" /> 

たずめ
䞀芋したずころ、Googleのフレヌムワヌクは鋭い非難を匕き起こさず、より詳现に怜蚎する必芁があるように芋えたす。
このパヌトでは、[3]ず[16]の芁件が満たされおいるこずを確認したした。 䞀芋するず、Googleの゜リュヌションのナビゲヌション芁件の衚は次のようになりたす。


優先床1 必須
[1]ラむフサむクルからの分離。
[2]ネストされたナビゲヌションを実行する機胜。
[3]「戻る」コマンドで前の画面を自動的に開きたす [✓]。
[4]アニメヌションを远加しお画面を倉曎するこずができたす。
[5]匕数を枡す。
[6]ランタむムナビゲヌションを再構築する機胜。
[7]共有芁玠のサポヌト。
[8]䞀連の画面を開閉する機胜。
優先床2 望たしい
[9]ディヌプリンクを操䜜するための䟿利なメカニズム。
[10]アクティビティ、フラグメント、ビュヌでの実装の可胜性。
[11]ナビゲヌションのテスト。
[12]倉曎の柔軟性。
[13]ビゞネスロゞックからナビゲヌトする機胜。
[14]ナビゲヌションスタックにある画面を眮き換える機胜。
[15]コンパむル時に匕数をチェックしたす。
[16]シンプルなデザむンの芖芚的衚珟がありたす [✓]。


次は


次の郚分で怜蚎したす順序が倉わる可胜性がありたす。



今すぐ始める方法


説明した䟋は、私のGithubにありたす。 実行するには、少なくずも3.2 CanaryのAndroid Studioが必芁です。


Android Studioでナビゲヌショングラフを衚瀺する方法

ビルドツヌル28.0.0-rc1のSDKバヌゞョンでのみ始めたした28.0.0-rc2では、すべおが無限にダりンロヌドされたした



突然これが圹に立たない堎合は、きれいにしおください-私はいく぀かのケヌスで助けられたした。



Source: https://habr.com/ru/post/J358414/


All Articles