关于android:导航-嵌套导航图和-include-MAD-Skills

57次阅读

共计 4558 个字符,预计需要花费 12 分钟才能阅读完成。

这是第二个对于导航 (Navigation) 的 MAD Skills 系列,本文是导航组件系列的第三篇文章,如果您想回顾过去公布的内容,请参考上面链接查看:

  • 导航组件概览
  • 导航到对话框
  • 在利用中导航时应用 SafeArgs
  • 应用深层链接导航
  • 打造您的首个 app bundle
  • 深入浅出 NavigationUI
  • 应用导航组件: 条件导航

如果您更偏向于观看视频而非阅读文章,请 点击这里 查看视频内容。

概述

在本系列之前的文章中,咱们减少了咖啡记录性能,应用导航 UI 进步了用户体验,并且实现了有条件导航。

在本文中,咱们将理解如何通过应用嵌套图治理导航图,并且应用 include 标签来引入其余图。这就须要咱们将利用模块化,并且理解导航如何在模块间实现操作。

那么,接下来,让咱们关上 Android Studio 开始学习如何在模块上应用导航吧。

嵌套导航图

咱们从导航图开始。嵌套图容许您在父导航图中将一系列目的地页面分组。

咱们看一眼导航图,coffeeList 和 coffeeEntryDialog 目的地页面非常适合转换为嵌套图。要达成这个目标,我这里长按 shift 并且同时抉择 “Move to Nested Graph” (挪动到嵌套图):

△ 将 coffeeList 和 coffeeEntryDialogFragment 挪动到嵌套图

当初咱们回到代码界面,您能够看到嵌套图仅仅是根图中的新导航图:

<navigation 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"
   app:startDestination="@id/donutList">

   <fragment
       android:id="@+id/donutList"
       android:name="com.android.samples.donuttracker.donut.DonutList"
       android:label="@string/donut_list" >
       <action
           android:id="@+id/action_donutList_to_donutEntryDialogFragment"
           app:destination="@id/donutEntryDialogFragment" />
       <action
           android:id="@+id/action_donutList_to_selectionFragment"
           app:destination="@id/selectionFragment" />
   </fragment>
   <dialog
       android:id="@+id/donutEntryDialogFragment"
       android:name="com.android.samples.donuttracker.donut.DonutEntryDialogFragment"
       android:label="DonutEntryDialogFragment">
       <deepLink app:uri="myapp://navdonutcreator.com/donutcreator" />
       <argument
           android:name="itemId"
           app:argType="long"
           android:defaultValue="-1L" />
   </dialog>
   <fragment
       android:id="@+id/selectionFragment"
       android:name="com.android.samples.donuttracker.setup.SelectionFragment"
       android:label="@string/settings"
       tools:layout="@layout/fragment_selection" >
       <action
           android:id="@+id/action_selectionFragment_to_donutList"
           app:destination="@id/donutList" />
   </fragment>
   <navigation
       android:id="@+id/coffeeGraph"
       app:startDestination="@id/coffeeList">
       <fragment
           android:id="@+id/coffeeList"
           android:name="com.android.samples.donuttracker.coffee.CoffeeList"
           android:label="@string/coffee_list">
           <action
               android:id="@+id/action_coffeeList_to_coffeeEntryDialogFragment"
               app:destination="@id/coffeeEntryDialogFragment" />
       </fragment>
       <dialog
           android:id="@+id/coffeeEntryDialogFragment"
           android:name="com.android.samples.donuttracker.coffee.CoffeeEntryDialogFragment"
           android:label="CoffeeEntryDialogFragment">
           <argument
               android:name="itemId"
               android:defaultValue="-1L"
               app:argType="long" />
       </dialog>
   </navigation>
</navigation>

所抉择的 Fragment 之间的导航被迁徙至嵌套图中。

嵌套图必须蕴含 id。您能够应用这个 id 实现导航到嵌套图的代码,但并不是间接转换到其子目的地页面。嵌套图蕴含本人的启动目的地页面,并且请不要离开裸露它们的子目的地页面。

<navigation
   android:id="@+id/coffeeGraph"
   app:startDestination="@id/coffeeList">

如果您双击嵌套图,就能够发现嵌套的目的地页面和它们之间的操作。

Include 标签

除了应用嵌套图之外,我还能够提取图到新的导航 xml 文件中。我在这里创立了一个新的 xml 文件,名称为 coffee_graph,并且将嵌套图的内容迁徙到这个文件中。

<navigation 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:id="@+id/coffeeGraph"
   app:startDestination="@id/coffeeList">
   <fragment
       android:id="@+id/coffeeList"
       android:name="com.android.samples.donuttracker.coffee.CoffeeList"
       android:label="@string/coffee_list">
       <action
           android:id="@+id/action_coffeeList_to_coffeeEntryDialogFragment"
           app:destination="@id/coffeeEntryDialogFragment" />
   </fragment>
   <dialog
       android:id="@+id/coffeeEntryDialogFragment"
       android:name="com.android.samples.donuttracker.coffee.CoffeeEntryDialogFragment"
       android:label="CoffeeEntryDialogFragment">
       <argument
           android:name="itemId"
           android:defaultValue="-1L"
           app:argType="long" />
   </dialog>
</navigation>

我能够通过 include 标签将新的图嵌套到其余文件中。尽管应用 include 标签在性能上与应用嵌套图雷同,但您还能够应用其余我的项目模块或者库我的项目的图。

<include app:graph="@navigation/coffee_graph"/>

和嵌套图相相似,援用的图不会裸露目的地页面的列表,也就是说我须要更新菜单 id 来指向 coffeeList。

<item
   android:id="@id/coffeeGraph"
   android:icon="@drawable/coffee_cup"
   android:title="@string/coffee_name" />

这里我更新了菜单以应用援用图的 id。因为 CoffeeList 是所援用图的起始页面,所以我能够应用图 id 来导航到这个图。如果您当初试着运行利用,所有的性能会和之前一样。

当初咖啡记录的导航图曾经实现拆散,咱们能够对利用进行模块化解决,顺便能够看一下在模块之间导航的成果如何。

如果您心愿同步操作,能够查看 代码,外面蕴含了到目前为止我所做的全副批改。我创立了两个新的模块: core 和 coffee。我将所有罕用的类迁徙到 core 模块中,比方 Donut、Coffee、DAO、Database 以及其余常见资源。

接下来,我将所有在咖啡记录中用到的 fragment、viewModel 和 adapter 类迁徙到 coffee 模块中。在咖啡记录中用到的布局和其余资源也迁徙到这里,包含 coffee_graph。

△ 已有的类和资源被迁徙到了 core 和 coffee 模块中

coffee 模块依赖 core 模块:

dependencies {implementation project(":core")

   //...
}

最初,在 app 模块中,增加 coffee 和 core 作为 app 模块的依赖:

dependencies {implementation project(":coffee")
   implementation project(":core")
   //..
}

请留神这里的导航图没有任何变动,它不受这些批改的影响:

△ 导航图没有发生变化

当初如果运行利用,所有的性能一如平常,只不过外部应用了模块。您能够查看 最终的代码。

通过上述批改,我将咖啡记录模块和与它相干的导航流从利用中拆散了进去,也就意味着咖啡记录模块能够独立于甜甜圈记录利用应用。

总结

在本文中,咱们理解了如何创立嵌套导航图,以及如何应用 include 标签来模块化甜甜圈记录利用。

在下一篇文章中,咱们会更进一步学习如何应用功能模块进行导航。敬请关注!

欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!

正文完
 0