Navigation
简介
navigation(导航)一般应用在一个主Activity和多个Fragment的情景中。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。
导航组件由以下三个关键部分组成:
- 导航图:一个包含所有导航相关信息的 XML 资源。这包括应用内所有目的地和路径。
-
NavHost
:用于显示导航图中目的地的空白容器,在Activity布局中配置实现。导航组件包含一个默认NavHost
实现 (NavHostFragment
),可显示 Fragment 目的地。 -
NavController
:在NavHost
中管理应用导航的对象。当用户在整个应用中移动时,NavController
会安排NavHost
中目的地的交换。
在应用中导航时,您告诉 NavController
,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController
便会在 NavHost
中显示相应目标。
嵌套图表、全局操作
略
目的地之间传递数据
首先在接收参数的目的地中设置参数类型、名称:
- 接收的Fragment中设置参数,负责接收
<fragment
android:id="@+id/firstFragment"
android:name="com.futuring.jetpackdemo.FirstFragment"
android:label="FirstFragment">
<argument
android:name="EMAIL"
android:defaultValue="2005@qq.com"
app:argType="string" />
<action
android:id="@+id/action_firstFragment_to_thirdFragment"
app:destination="@id/thirdFragment" />
</fragment>
之后在路径(action)中设置参数类型:
- action中附加参数,实现传递参数的功能
<action
android:id="@+id/action_mainFragment_to_navigation"
app:destination="@id/firstFragment">
<argument
android:name="EMAIL"
android:defaultValue="2005@qq.com"
app:argType="string" />
</action>
Safe Args
Navigation 组件具有一个名为 Safe Args
的 Gradle 插件,该插件可以生成简单的 object 和 builder 类,以便以类型安全的方式浏览和访问任何关联的参数。强烈建议将 Safe Args 用于导航和数据传递,因为它可以确保类型安全。
启用Safe Args
后,会自动生成一些代码。生成的代码会为每个源目的地、接收目的地以及每个操作,生成以下类型安全的类和方法。
-
为生成操作的每一个源目的地创建一个类。该类的名称是在源目的地的名称后面加上“
Directions
”。例如,如果源目的地是名为 SpecifyAmountFragment 的 Fragment,则生成的类的名称为 SpecifyAmountFragmentDirections。该类会为源目的地中定义的每个操作提供一个方法。 -
对于用于传递参数的每个操作,都会创建一个内部类,该类的名称根据操作的名称确定。例如,如果操作名称为 action_mainFragment_to_secondFragment,,则类名称为 ActionMainFragmentToNavigation(也不一定)。如果您的操作包含不带 defaultValue 的参数,则您可以使用关联的 action 类来设置参数值。
-
为接收目的地创建一个类。该类的名称是在目的地的名称后面加上“
Args
”。例如,如果目的地 Fragment 的名称为 ConfirmationFragment,,则生成的类的名称为 ConfirmationFragmentArgs。可以使用该类的 fromBundle() 方法检索参数。
MainFragmentDirections.ActionMainFragmentToNavigation action = MainFragmentDirections
.actionMainFragmentToNavigation().setEMAIL("@qq.com");