A、ナビゲーションの紹介
ナビゲーション コンポーネントJetpackのコンポーネントライブラリであり、あなたは簡単にフラグメントを管理することができ、それは断片での経路として見ることができます。主な機能は次のとおりです:ナビゲーション・ページジャンプAPPを管理する一方で、スイッチングフラグメントは、より直感的、視覚的なインターフェースフラグメントを切り替えるには、フローチャートを示しています。
このコンポーネントは、FragmentTransactionの複雑さに対処できるようにしながら、あなたは(そのようなライフサイクルとのViewModelなど)のアーキテクチャコンポーネントを取得することができ、すべての利益のためのナビゲーションフラグメントアセンブリのネイティブサポートを使用しました。さらに、ナビゲーションアセンブリもアニメーション処理を移行してもよいです。それはすることができ、自動的に正しい「アップ」と「リターン」行動構築、ディープリンクを完全にサポートを含み、ナビゲーション関連などの引き出しや下部のナビゲーションなどの適切なUIウィジェットへのヘルププログラムを提供します。
また、ナビゲーションの最大の利点の一つは、次のとおりです。選択のレッツ活動単一のアプリケーション・アーキテクチャ(例:シングルアクティビティ+マルチフラグメント)。対処するためのナビゲーションにより、アプリケーション内のフラグメントジャンプページ、開発者は、複雑さとアニメーションFragmentTransactionの関連移行を必要としません。
二、ナビゲーション中核となる概念
- NavGraph:マップ、一つの場所で一緒にすべてのナビゲーション関連情報を含むXMLリソース。これは、すべての個々のコンテンツ領域(宛先)を備え、ユーザはアプリケーションを介して可能な経路にアクセスすることができます。図以下のフローチャートと同様。
- NavHost:先にマップを表示するコンテナ。ナビゲーションパックはNavHostFragmentを達成NavHostデフォルトが含まれています。
- NavController:容器NavHostの内容の制御切替制御装置。
- 宛先:断片一般断片を(APPシングルモードアクティビティので推奨グーグル)、活性であってもよいです。図の以下の3つのインターフェイス。
- 処置:操作同等の意図は、から発現 先 別に デスティネーション図の矢印次、。
三、ナビゲーションの使用
1.輸入依存関係
implementation 'androidx.navigation:navigation-fragment:2.2.1'
implementation 'androidx.navigation:navigation-ui:2.2.1'
活動や複数の断片を作成します。2.
ビジネス・ロジックの作成によると、あなたはMainActivity、FragmentA、FragmentBを作成することとします。
3. 新しいナビゲーション
- で
res
カタログを右新規作成]> [新しいリソースファイル、ポップアップNew Resource File
ダイアログボックス - 以下のような塗りつぶしファイル名:nav_graph、リソースの種類の選択
Navigation
、[OK]をクリックします
4. 使用ナビゲーション
オープンはnav_graph.xml
、下部にある[デザイン]タブを選択し、クリックしますNew Destination
(左上隅+)ボタンでポップアップを選択しfragment_a.xml
、fragment_b.xml;
またはSELECT Create blank destination
新しいフラグメントの後に、次のインターフェイスを表示します。
5. NavHostFragmentを追加します。
私たちが作成したばかりに関連したレイアウトとNavHostFragmentナビゲーションで活動中NavHostFragmentを追加します。
それはドラッグの仕方によって追加されている場合は、ナビゲーションマップのリストを含むダイアログボックスをポップアップ表示されます、あなたが作成したナビゲーションを選択することができます。あなたはまた、指定されたコードを使用することができます
app:navGraph="@navigation/nav_graph"
6. アクションを追加します。
右へ左の円の中央を押しながら、その後、その後、移動を手放すためにフラグメントにフラグメントをドラッグします。
7. からNavControllerプロセスは、アクションをジャンプ
必要性からNavControllerオブジェクトジャンプ navigate(int id)
ジャンプに方法を。
NavControllerオブジェクトは、次の3つの方法で得られました
NavHostFragment.findNavController(Fragment)
Navigation.findNavController(Activity, @IdRes int viewId)
Navigation.findNavController(View)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Navigation.findNavController(view)
button.setOnClickListener {
//id就是nav_graph导航图里面的action id
Navigation.findNavController(view).navigate(R.id.action_blankFragment_to_secondeFragment)
}
}
それが返された場合、呼び出し navigateUp()
方法を。
四、ナビゲーション拡大
1.ナビゲーションパラメータの受け渡し
(1)コードのパラメータの受渡し
あなたは大量参加のバンドルを使用することができます。
Bundle bundle = new Bundle();
bundle.putString("param", "I AM FROM FRAGMENT-A");
Navigation.findNavController(it).navigate(R.id.action_fragmentA_to_fragmentC, bundle);
(2)マップのパラメータ渡し
Bを基準として伝記、ナビゲーション地図デザイン・ページ、先Bをクリックし、次のようにポップアップウィンドウの右側にプロパティバーに引数を追加します。
作成したら、次のように、フラグメントタグは、タグの引数を追加します。
<argument
android:name="name"
android:defaultValue="no"
app:argType="string" />
之后可通过两种方式传递参数:
- FragmentBArgs
- FragmentADirections
它们都是自动生成的,FragmentBArgs 是根据fragment 节点下的 argument 节点生成的;FragmentADirections 是根据 action 生成的。
使用生成的对应的 Agrs 或者 Directions 来传递参数,需要导入 apply plugin: 'androidx.navigation.safeargs'。
//使用FragmentBArgs
val bundle = FragmentBArgs.Builder().setText("Hello World").build().toBundle()
Navigation.findNavController(it).navigate(R.id.action_fragmentA_to_fragmentB, bundle)
//使用FragmentADirections
val direction = FragmentADirections.action_fragmentA_to_fragmentB().setText("Hello World")
Navigation.findNavController(it).navigate(direction)
2. Navigation 动画
点击箭头,右边属性栏有个Animations列表。默认都是null,可以设置官方自带的进出栈动画,也可以设置自定义动画。
- Enter 进入一个目的地 (例如 A跳B, B显示时执行的动画)
- Exit 退出一个目的地 (例如 A跳B,A隐藏时执行的动画)
- Pop Enter通过 pop 操作进入目的地 (例如 A跳B,B navigateUp 后 A再次出现时执行的动画)
- Pop Exit 通过pop 操作退出目的地 (例如 A跳B,B navigateUp 后 B消失时执行的是这个动画)