今天學習Android的navigation
github地址 https://github.com/Eric-Han0521/NavigationExamplesTest.git
導航是指支持用戶導航多望、進入和退出應用中不同內容片段的交互。Android Jetpack 的導航組件可幫助您實現導航氢烘,無論是簡單的按鈕點擊怀偷,還是應用欄和抽屜式導航欄等更為復雜的模式,該組件均可應對播玖。導航組件還通過遵循一套既定的規(guī)則來確保一致且可預測的用戶體驗椎工。
導航組件由以下三個關鍵部分組成:
導航圖:在一個集中位置包含所有導航相關信息的 XML 資源。這包括應用內所有單個內容區(qū)域(稱為目標)以及用戶可以通過應用獲取的可能路徑蜀踏。
NavHost:顯示導航圖中目標的空白容器维蒙。導航組件包含一個默認 NavHost 實現 (NavHostFragment),可顯示 Fragment 目標果覆。
NavController:在 NavHost 中管理應用導航的對象颅痊。當用戶在整個應用中移動時,NavController 會安排 NavHost 中目標內容的交換随静。
在應用中導航時八千,您告訴 NavController,您想沿導航圖中的特定路徑導航至特定目標燎猛,或直接導航至特定目標恋捆。NavController 便會在 NavHost 中顯示相應目標。
導航組件提供各種其他優(yōu)勢重绷,包括以下內容:
處理 Fragment 事務沸停。
默認情況下媚媒,正確處理往返操作宴凉。
為動畫和轉換提供標準化資源砍濒。
實現和處理深層鏈接翠储。
包括導航界面模式(例如抽屜式導航欄和底部導航),用戶只需完成極少的額外工作假颇。
Safe Args - 可在目標之間導航和傳遞數據時提供類型安全的 Gradle 插件次慢。
ViewModel 支持 - 您可以將 ViewModel 的范圍限定為導航圖岩馍,以在圖表的目標之間共享與界面相關的數據倒淫。
此外伙菊,您還可以使用 Android Studio 的 Navigation Editor 來查看和編輯導航圖。
Android developer官網復制,手動狗牌
依賴導入鏈接 https://developer.android.google.cn/guide/navigation/navigation-getting-started
本篇設計主題包括Create destinations镜硕,Design navigation graphs运翼,Global actions,Navigate to a destination兴枯,Conditional navigation血淌,Pass data between destinations,Animate transitions between destinations
在創(chuàng)建項目之前po出完成的項目結構财剖,以供參考
首先創(chuàng)建一個Android project悠夯,并把項目名定義的特別長顯的高級
然后接入正題
首先我們需要準備6個fragment備用,并在對應的布局文件中創(chuàng)建各種組件峰伙,布局文件代碼詳見github地址
然后取消選擇如下的兩個框框疗疟,因為我們暫時用不到
定義好6個fragment后我們創(chuàng)建我們的主角navigation graphs
然后在我們的activity_main.xml文件中創(chuàng)建一個fragment,并添加
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
別忘了設置fragment的id
然后在我們的nav_graph中將事先準備好的6個fragment添加進去
雖然有位偉大的課程老師和我們說過圖形界面都是歪門左道瞳氓,但是就是好用,哈哈哈哈哈
這里注意fragment添加的順序栓袖,首次被添加的會默認成為startDestination匣摘,也可以在nav_graph中設置startDestination
然后我們點擊框框邊的圓點進行拖拖拽拽,確定fragment的顯示先后順序
這時候我們可以看到nav_graph中出現密密麻麻的代碼裹刮,著重注意action音榜,我們很多屬性都需要在這里面設置
接下來我們我們在java文件中對布局文件中的組件進行注冊和跳轉控制,我們以MainFragment為例捧弃,在java文件中注入一下代碼
照貓畫虎赠叼,其他的幾個fragment的也按照這種方式去編輯
到這里我們有了一個可以運行的小項目了
接下來我們就可以在destination之間定義動畫了
動畫的定義其實很簡單,我們首先需要定義四個不同狀態(tài)的動畫违霞,分別為slide_in_left嘴办,slide_in_right,slide_out_left买鸽,slide_out_right涧郊,顧名思義分別是左側滑進,右側滑進眼五,左側滑出與右側滑出妆艘。然后我們在nav_graph中的action中引用這些
這樣我們destination之間的跳轉動畫也就做好了
以上圖的mianFragment和viewTransactionFragment為例,講解一下這四種屬性的區(qū)別
上圖我們知道看幼,這是mainFragment 跳轉到 viewTransactionFragment批旺,
app:enterAnim
是這個action的destination進入的動畫,是viewTransactionFragment的入場動畫
app:exitAnim
是這個action所在元素離開的動畫诵姜,是mainFragment的離場動畫
app:popEnterAnim
是action所在元素的入場動畫汽煮,即按下返回按鈕,destination出棧,mainFragment的入場動畫
app:popExitAnim
是destination出棧時離開的動畫逗物,即viewTransactionFragment的離場動畫
接下來我們進行fragment之間的通信
我們需要在fragment中定義argument來聲明要通信的關鍵字
如上圖所示搬卒,我們聲明了一個名為recipient的argument,初始值為None翎卓,我們只需要在準備跳轉到該destination的fragment的java文件中定義一個bundle契邀,并將bundle放入navController.navigate方法中即可
Bundle bundle = new Bundle();
bundle.putString("recipient",textInputEditText.getText().toString());
navController.navigate(R.id.action_chooseRecipientFragment_to_specifyAmountFragment,bundle);
然后我們在destination對應的java文件中調用getArguments().getString("recipient")就可以獲得上一個fragment傳過來的值
到這,navigation的入門基本屬于告一段落了
這就是這篇文章的全部內容了失暴,希望對大家有所幫助
祝程序員們多敲代碼坯门,少入坑,從此遠離ICU逗扒,拜拜