天天看點

安卓Navigation單Activity架構

    最近在做一個小項目,項目主要是用到了安卓Jetpack中的Navigation來實作單Activity架構。網上雖然有很多介紹Navigation的文章,但是缺乏實際的開發說明介紹,本人在這次開發中因為第一次采用單Activity的方式開發,遇到了不少的坑,本片文章記錄了利用Navigation來實作單Activity的一些問題,避免大家遇到同樣的問題而耽誤時間。

    Navigation的使用這裡就不展開介紹了,網上一抓一大把,入門的朋友們自行查閱。這裡隻記錄在開發中遇到的問題。最基礎的問題---fragment每次都重建導緻頁面每次都重新整理,這個解決就是把建立的view儲存起來然後每次onCreateView的時候判斷view是否為空,是就建立,不是就直接傳回。其他的問題咱們一起來看一下~

    問題一:嵌套Fragment,子頁面還需要去嵌套Fragment來做頁面,這個問題比較好解決,就是在子頁面寫fragment的時候不能在xml去定義fragment,這樣會報錯。隻能在xml中像以前一樣去寫一個layout,然後動态的添加fragment。

    問題二:系統傳回鍵處理,也比較好解決,在Activity中定義一個局部變量fragment,然後在Base每次onResume的時候将該變量指向自己,像這樣

安卓Navigation單Activity架構

然後在BaseFragment中定義一個方法,子類如需處理Back事件,重寫此方法并傳回true

安卓Navigation單Activity架構

最後在Activity中處理具體的事件

安卓Navigation單Activity架構

    問題三:退出應用的Back事件處理;也比較好處理。首先我們來到我們第一層Fragment,也就是Activity最接近的Activity,我這裡命名的是“MainFragment”,然後在這裡重寫我們上一步在BaseFragment中定義的攔截傳回的方法,并傳回true

安卓Navigation單Activity架構

代碼就不給大家翻譯了,一目了然,ok問題三解決。

    問題四:跳轉同一頁面。有個需求是這樣的,拿文章來舉例,在文章詳情頁中,觀看文章,啪啦啪啦全是圖文混排的内容,然後底下有一個推薦文章清單,點選依然進入文章詳情頁。剛開始在navigation的編輯頁用目前fragment指向自己去實作,發現根本不能完成跳轉。解決步驟:

在navigation的xml中,添加具體fragment,右鍵Add Action選擇Global

安卓Navigation單Activity架構

這樣它左邊會有一個箭頭指向它:

安卓Navigation單Activity架構

切換到text

安卓Navigation單Activity架構

可以看到系統為我們生成了一個action,并指向剛剛添加的fragment。然後在你想跳轉的地方使用這個action就可以了。

    問題五:A跳轉B,B再跳轉C,在C做完操作,想直接回到A。預設一次一次按傳回鍵是達不到的,我們需要這樣調用:

Navigation.findNavController(view!!).popBackStack(R.id.mainFragment, true),

源碼中的方法

public boolean popBackStack(@IdRes int destinationId, boolean inclusive)

這個回退方法接收兩個參數,第一個:目的地id,注意是fragment在navigation中定義的id不是actionid,第二個參數是,是否将目的地彈出棧,在這個跳轉流程中A->B->C,此時棧中有A、B、C,是以我們此時傳回A需要将目标也出棧,并且在這個過程中會将途中的fragment都出棧。

    問題六:開屏頁,這是最難解決的,也是目前本人算是繞過去解決或者說從根本上不算解決的解決方法。因為在給navigation配置的時候,預設要設定一個根目标,就是啟動後預設進入的第一個fragment,同時配置讓navigation來為我們做棧管理defaultNavHost=“true”。這樣在每次我們傳回時預設最後會留在這個配置的startDestination。是以我們也無法讓我們的SplashFragment來做startDestination,這樣會把Splash頁作為根了。本人也是嘗試了很多方式,最後用了不算辦法的辦法...就是一切都是正常配置,隻是在開啟MainFragment以後第一時間跳轉到Splash,做完操作後再回到Splash,當然傳回也是要用問題五點方法popBackStack去傳回。

    本片文章記錄了筆者嘗試用Navigation實作單Activity架構中遇到的一些實際開發問題,文章開頭也說了網上文章介紹Navigation的很多,不過大多是一些用法入門,實際開發中的一些實際問題确實很少能找到資料。如有不足希望大家留言探讨,尤其是對于文章中的問題六進行補充。不足之處請指正,勿噴輕噴,感謝大家。