簡介
navigation(導(dǎo)航)一般應(yīng)用在一個(gè)主Activity和多個(gè)Fragment的情景中。在具有多個(gè) Activity 目的地的應(yīng)用中,每個(gè) Activity 均擁有其自己的導(dǎo)航圖。
導(dǎo)航組件由以下三個(gè)關(guān)鍵部分組成:
- 導(dǎo)航圖:一個(gè)包含所有導(dǎo)航相關(guān)信息的 XML 資源。這包括應(yīng)用內(nèi)所有目的地和路徑。
-
NavHost:用于顯示導(dǎo)航圖中目的地的空白容器,在Activity布局中配置實(shí)現(xiàn)。導(dǎo)航組件包含一個(gè)默認(rèn)NavHost實(shí)現(xiàn) (NavHostFragment),可顯示 Fragment 目的地。 -
NavController:在NavHost中管理應(yīng)用導(dǎo)航的對象。當(dāng)用戶在整個(gè)應(yīng)用中移動時(shí),NavController會安排NavHost中目的地的交換。
在應(yīng)用中導(dǎo)航時(shí),您告訴 NavController,您想沿導(dǎo)航圖中的特定路徑導(dǎo)航至特定目標(biāo),或直接導(dǎo)航至特定目標(biāo)。NavController 便會在 NavHost 中顯示相應(yīng)目標(biāo)。
嵌套圖表、全局操作
略
目的地之間傳遞數(shù)據(jù)
首先在接收參數(shù)的目的地中設(shè)置參數(shù)類型、名稱:
- 接收的Fragment中設(shè)置參數(shù),負(fù)責(zé)接收
<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)中設(shè)置參數(shù)類型:
- action中附加參數(shù),實(shí)現(xiàn)傳遞參數(shù)的功能
<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 組件具有一個(gè)名為 Safe Args 的 Gradle 插件,該插件可以生成簡單的 object 和 builder 類,以便以類型安全的方式瀏覽和訪問任何關(guān)聯(lián)的參數(shù)。強(qiáng)烈建議將 Safe Args 用于導(dǎo)航和數(shù)據(jù)傳遞,因?yàn)樗梢源_保類型安全。
啟用Safe Args后,會自動生成一些代碼。生成的代碼會為每個(gè)源目的地、接收目的地以及每個(gè)操作,生成以下類型安全的類和方法。
為生成操作的每一個(gè)源目的地創(chuàng)建一個(gè)類。該類的名稱是在源目的地的名稱后面加上“
Directions”。例如,如果源目的地是名為 SpecifyAmountFragment 的 Fragment,則生成的類的名稱為 SpecifyAmountFragmentDirections。該類會為源目的地中定義的每個(gè)操作提供一個(gè)方法。對于用于傳遞參數(shù)的每個(gè)操作,都會創(chuàng)建一個(gè)內(nèi)部類,該類的名稱根據(jù)操作的名稱確定。例如,如果操作名稱為 action_mainFragment_to_secondFragment,,則類名稱為 ActionMainFragmentToNavigation(也不一定)。如果您的操作包含不帶 defaultValue 的參數(shù),則您可以使用關(guān)聯(lián)的 action 類來設(shè)置參數(shù)值。
為接收目的地創(chuàng)建一個(gè)類。該類的名稱是在目的地的名稱后面加上“
Args”。例如,如果目的地 Fragment 的名稱為 ConfirmationFragment,,則生成的類的名稱為 ConfirmationFragmentArgs??梢允褂迷擃惖?fromBundle() 方法檢索參數(shù)。
MainFragmentDirections.ActionMainFragmentToNavigation action = MainFragmentDirections
.actionMainFragmentToNavigation().setEMAIL("@qq.com");